受欢迎的博客标签

前言

最近需要利用C++和C#混合编程,然后就写了一个C#调用C++生成的DLL的DEMO。现在把C++生成DLL供C#调用的流程写出来。

首先明白一个前提:C#是托管型代码。C++是非托管型代码。
托管型代码的对象在托管堆上分配内存,创建的对象由虚拟机托管。(C# )
非托管型代码对象有实际的内存地址,创建的对象必须自己来管理和释放。(C++)

由于C#编绎出来的DLL不是计算机所能直接识别的二进制指令码,需要CLR进行再解释,说到这,我想有些朋友应该知道C#项目需要引用C++编写的DLL时,可以直接引用DLLMPORT来实现调用。而反向的话,C++项目却不能简单靠引用来使用C#编写的DLL。

由于C++项目默认配置是没有公共语言运行支持的,因此创建有公共语言运行支持的C++ dll,来实现C#项目对C++编写DLL的调用。

 

创建有公共语言运行支持的C++ dll,有两种方式:

1.创建标准的dll,修改配置参数,让其成为 c++ CLR Class Library

Create a simple native DLL

Configure mixed-mode 

Create a simple .NET Core  app to call the DLL

 

2.直接创建 c++ CLR Class Library

create  c++ CLR Class Library 

 

准备

Os:windows server 2012

Tool:Microsoft Visual Studio Enterprise 2019
版本 16.5.4

step 1:Create a simple native DLL

创建C++ DLL
注意,32bit和64bit之间不兼容

创建普通dll工程

step 2:configure and build the DLL project

The C++ project file needs the /clr option. This can be set for the whole project on the general tab.
设置Properties -> Configuration Properties -> General -> Project Defaults -> Common Language Runtime Support = [Common Language Runtime Support (/clr)]
设置turn off "/permissive-": Properties -> Configuration Properties -> C/C++ -> Language -> Conformance mode = No
修改debug|release设置后,Properties也要记得修改。

clr:netcore
 

托管类中需要用到Bitmap类时,需要添加引用,右键当前工程-> Add(添加)引用 -> Assemblies(程序集) -> Framework(框架) -> 勾选System.Drawing,就可以在托管C++中调用Bitmap类了。

System::Drawing::Bitmap ^clrClass::getImage(double scale)
{
    System::Drawing::Bitmap ^img = gcnew System::Drawing::Bitmap(5,5);
    img->SetPixel(1,1, System::Drawing::Color::FromArgb(255,0,0));
    return img;
}

step 3:Create a simple managed app to call the DLL

C#中调用
引用DLL: 工程 -> References -> Add References -> Browse -> [Browse] -> 添加C++工程生成的DLL

正常使用即可,典型使用如下。
clrClass cc = new clrClass();
// 后面就可以用C#的方式使用了
注意:如果C++工程的dll引用了其他dll,需要把二级引用的dll手动加到bin文件夹下对应位置。

 

https://www.cnblogs.com/GIScore/p/5872565.html

https://devblogs.microsoft.com/cppblog/an-update-on-cpp-cli-and-dotnet-core/

How to: Debug in mixed mode (C#, C++, Visual Basic

https://www.codeproject.com/Articles/19354/Quick-C-CLI-Learn-C-CLI-in-less-than-10-minutes#A8

Table of contents
What's C++/CLI
Handles and Pointers
Hello World
Classes and UDTs
Arrays
Parameter Array
Properties
Wrapping Around a Native C++ Class
Wrapping Around C Callbacks
The Other Way Round: From Managed to C Callbacks