“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第3篇文章,点击查看活动详情”
一、前言
| 平台 | 开发环境 |
|---|---|
| Windows | Visual Studio 2019 |
二、创建C#代码
-
按照下图标注内容创建C#代码
-
注意一定要选择C#的类库(.Net Framework)
-
填写项目名称,这里叫CSharpDLL
-
修改类名
-
改为person
-
写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; } } -
生成解决方案
-
打开工程所在文件夹,你可以在 \bin\Debug 文件夹下看到 CSharpDll.dll 文件
-
将其复制到需要调用的 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创建的对象必须自己来管理和释放.
- C++/CLI中使用gcnew关键字表示在托管堆上分配内存,并且为了与以前的指针区分,用^来替换*,就语义上来说他们的区别大致如下:
3.2 环境配置
3.2.1 设置公共语言运行时支持/clr
-
在属性页设置下图标注项,值如图所示
3.2.2 设置符合模式==>否
- 在属性页设置下图标注项,值如图所示
3.3 调试
- 在下图位置添加断点
- 生成解决方案
- 调试(F5),你将看到,成功创建了Person对象,并且赋了初值
- 继续调试(F11) ,你将看到,成功修改了年龄
成功实现了 C++ 调用 C#