前言:

C#:编绎出来的DLL不是计算机所能直接识别的二进制指令码,需要CLS进行再解释。

由于C++项目默认配置是没有公共语言运行支持的,因此我们需要更改一些配置,来实现C++项目对C#编写DLL的调用

首先明白一个前提:C#是托管型代码。C++是非托管型代码。

托管型代码的对象在托管堆上分配内存,创建的对象由虚拟机托管。(C# )

非托管型代码对象有实际的内存地址,创建的对象必须自己来管理和释放。(C++)

这个链接是别人介绍 [托管型代码 和 非托管型代码 区别]
https://blog.csdn.net/xiaominggunchuqu/article/details/79001329

下面来写个demo测试一下:

c#生成dll

环境:win7 + vs2017
1.新建个 c#的dll
在这里插入图片描述

2.随便写个 接口 等会在c++里面调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSlib
{
    public class Class1
    {

        public int returnValue_()
        {
            return 100;
        }
    }
}

3.生成->生成解决方案 会发现目录下已经有dll了
在这里插入图片描述

用c++调用c# dll

1.新建个c++项目 改下项目属性 [支持公共语言运行时支持]
在这里插入图片描述

2.code

// testCSlib.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>

#using "D:\C#Work\CSlib\CSlib\bin\Debug\CSlib.dll"	//c# dll的绝对路径

#pragma managed

using namespace CSlib; // c#dll 的 命名空间



int main()
{
    std::cout << "Hello World!\n"; 

		
	CSlib::Class1 ^c = gcnew CSlib::Class1();

	int a = c->retrunValue();
	std::cout << "c->rc:" << a<<std::endl;


	system("pause");
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门提示: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

在这里插入图片描述

警告:

需要把 c#的 dll 拷贝到 c++的exe 目录下才可以 。

在这里插入图片描述

否则 会报这个错误
在这里插入图片描述

3、其他补充说明:
1)为什么使用gcnew 而不使用 new ?
C++/CLI中使用 gcnew 关键字用来表示 在托管堆上分配内存,并且区分其他指针的区别,使用 ^ 来代替 * 作为指针含义, 语义上大致如下:
(1)、gcnew返回的是一个句柄(handle), 而new 返回的是实际的内存地址
(2)、gcnew创建的对象由虚拟机托管,而new创建的对象必须自己来管理和释放

在此不是有C++本身来分配内存空间,而是由其他虚拟机托管分配,并且不需要C++程序来释放空间

如果想了解CLI更详细情况,可以参考【这个是转载的别人的】:http://www.codeproject.com/Articles/6882/A-first-look-at-C-CLI

菜鸡一枚 多多关照!
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐