C++调用C#库(DLL)

一、工作环境

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文件 放在一个文件夹下。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wanormi/article/details/85319271