C++ 调用 C#

601 阅读2分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第3篇文章,点击查看活动详情

一、前言

平台开发环境
WindowsVisual Studio 2019

二、创建C#代码

  • 按照下图标注内容创建C#代码

    image.png

  • 注意一定要选择C#的类库(.Net Framework)

    image.png

  • 填写项目名称,这里叫CSharpDLL

    image.png

  • 修改类名

    image.png

  • 改为person

    image.png

  • 写C#代码,这里你可以粘贴下面的代码用于测试

    using System;
    
    namespace CSharpDll
    {
        public class Person
        {
            public Person()
            {
                Name = "No Name";
                Sex = 'N';
                Age = 0;
    
                m_strLastError = "No Error";
            }
    
            public Person(string strName, char cSex, int iAge)
            {
                m_strLastError = "No Error";
    
                Name = strName;
                Sex = cSex;
                Age = iAge;
            }
    
            public string Name
            {
                get
                {
                    return m_strName;
                }
    
                set
                {
                    if ((String.IsNullOrEmpty(value)) || (value.Length > 127))
                    {
                        m_strName = "No Name";
    
                        m_strLastError = "The length of the input name is out of range.";
    
                        return;
                    }
    
                    m_strName = value;
                }
            }
    
            public char Sex
            {
                get
                {
                    return m_cSex;
                }
    
                set
                {
                    if ((value != 'F') && (value != 'M') && (value != 'm') && (value != 'f'))
                    {
                        m_cSex = 'N';
    
                        m_strLastError = "The input sex is out of [F/M].";
    
                        return;
                    }
    
                    m_cSex = value;
                }
            }
    
            public int Age
            {
                get
                {
                    return m_iAge;
                }
    
                set
                {
                    if ((value < 0) || (value > 150))
                    {
                        m_iAge = 0;
    
                        m_strLastError = "The input age is out of range.";
    
                        return;
                    }
    
                    m_iAge = value;
                }
            }
    
            public string LastError
            {
                get
                {
                    return m_strLastError;
                }
            }
    
            private string m_strName;
            private char m_cSex;
            private int m_iAge;
            private string m_strLastError;
        }
    }
    
    
  • 生成解决方案

    image.png

  • 打开工程所在文件夹,你可以在 \bin\Debug 文件夹下看到 CSharpDll.dll 文件

    image.png

  • 将其复制到需要调用的 C++ 工程目录下

三、创建C++代码

3.1 创建 C++ 调用 C# 代码

  • 创建C++代码,过程省略
  • 复制下面的代码
// 引入C# dll
#using ".\x64\Debug\CSharpDll.dll"//最好使用相对路径
// 启用托管
#pragma managed
// 引用命名空间
using namespace CSharpDll;

// 在函数中调用
int main() 
{
	// 实例化类class
        //命名空间::类名^ 句柄名 = gcnew 命名空间::类名();
	CSharpDll::Person^ P = gcnew CSharpDll::Person("Laven", 'F', 27);
	P->Age = 18;  // 类的属性
	
	return 0;
}

注:

  • gcnew关键字
    • C++/CLI中使用gcnew关键字表示在托管堆上分配内存,并且为了与以前的指针区分,用^来替换*,就语义上来说他们的区别大致如下:
      • gcnew返回的是一个句柄(Handle),而new返回的是实际的内存地址.
      • gcnew创建的对象由虚拟机托管,而new创建的对象必须自己来管理和释放.

3.2 环境配置

3.2.1 设置公共语言运行时支持/clr

  • 在属性页设置下图标注项,值如图所示

    image.png

    image.png

3.2.2 设置符合模式==>否

  • 在属性页设置下图标注项,值如图所示

    image.png

3.3 调试

  • 在下图位置添加断点

    image.png

  • 生成解决方案
  • 调试(F5),你将看到,成功创建了Person对象,并且赋了初值

    image.png

  • 继续调试(F11) ,你将看到,成功修改了年龄

    image.png

成功实现了 C++ 调用 C#