一、工作环境
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文件 放在一个文件夹下。

本文档详细介绍了如何在C++中调用C#动态链接库(DLL)的过程,包括创建C#类库、配置MFC工程、使用gcroot及gcnew关键字进行内存管理,以及解决可能遇到的加载DLL文件的问题。
2443

被折叠的 条评论
为什么被折叠?



