一、工作环境
1.平 台:Windows 10 (64位)
2.软件环境:VS2013
3.项 目:MFC
二、C++调用C#库(DLL)
1.准备C#库 (Dll文件)
1.1 创建C#类库
1.2 实现C#代码
//C#代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ClassLibrary
{
public class MyClass
{
public String returnString()
{
return "I am from C#";
}
}
}
1.3 配置C#库工程并生成库
2. 准备MFC工程
2.1 创建MFC项目
2.2 CLR支持(公共语言运行支持)
2.3 引用和调用C#库
// 头文件中对C#库及命名空间的引用
#using "../Debug/ClassLibrary.dll"
using namespace ClassLibrary;
using namespace System; //下面用到System下的String (c#中命名空间)
//.cpp
ClassLibrary::MyClass ^myClass = gcnew MyClass(); //对C#中类进行实例
String^ string = myClass->returnString(); //调用C#中方法
CString str = (CString)string; //强制类型转换
GetDlgItem(IDC_EDIT1)->SetWindowText(str); //在编辑框中显示文本
##补充说明:
如果将C#的类定义成C++类的成员变量;
那么要用gcroot,例如:
// 在.h中
private:
gcroot<ClassLibrary::MyClass^> *myclass = new gcroot<ClassLibrary::MyClass^>;
//在函数中使用C#类变量
(*myclass) = gcnew ClassLibrary::MyClass;
String^ string = (*myclass)->returnString(); //调用C#中方法
CString str = (CString)string;
GetDlgItem(IDC_EDIT1)->SetWindowText(str);
2.4 运行结果
3其他补充说明
3.1 为什么使用gcnew 而不使用 new ?
C++/CLI中使用 gcnew 关键字用来表示 在托管堆上分配内存,并且区分其他指针的区别,使用 ^ 来代替 * 作为指针含义, 语义上大致如下:
(1)、gcnew返回的是一个句柄(handle), 而new 返回的是实际的内存地址
(2)、gcnew创建的对象由虚拟机托管,而new创建的对象必须自己来管理和释放
在此不是有C++本身来分配内存空间,而是由其他虚拟机托管分配,并且不需要C++程序来释放空间
3.2 使用#using 宏引入dll库文件, 而不是 #pragma comment(lib, “”)
后面主要用于引入C/C++库文件
3.3 执行时可能会出现以下问题
主要是由于exe程序加载的dll文件不存在或未找到,可以:
将 C#的库文件和pdb文件 与 C++的编译程序exe和pdb文件 放在一个文件夹下。