C#调用C++的dll两种方法(托管与非托管)

C#与C++交互,总体来说可以有两种方法:

  • 利用PInvoke实现直接调用 非托管C++
  • 利用C++/CLI作为代理中间层

一、非托管C++

由于C#编写的是托管代码,编译生成微软中间语言,而C++代码则编译生成本地机器码(这种C++也有叫做本地C++或者非托管C++,VC6.0就是用于开发非托管C++代码的平台),这两种语言进行混合编程就存在一定困难。

比较常用的方法是使用DllImport的方法,这种方法在网上有很多介绍,这里就不详细叙述了。但是用过这种方法的人都知道这种方法对于导出函数还可以但是却没法导出非托管C++类!非常的要命。

C# 通过P/Invoke调用C/C++函数

extern "C"外部声明,表示函数和变量是按照C语言的方式编译和链接的。

__decspec(dllexport)的目的是为了将对应的函数放入到DLL动态库中。

extern "C" _declspec(dllexport)的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做的DLL。

vs2019 实现C#调用c++的dll两种方法

二、托管C++ 与 C++/CLI

除了C#、非托管C++外,C系列中还存在一种语言叫做托管C++,这种语言语法上和非托管C++几乎一样,但是却和C#一样编译成为微软中间语言,这样托管C++就可以和C#良好地通信,即可以在C#中使用托管C++类。

另外,托管C++还有两个及其重要的特性就是:

  • 可以调用非托管C++的类和函数!
  • 托管C++的程序集可以嵌套非托管C++编译的机器码!

所以我们的技术路径也就明晰了:C#以托管C++为中介调用非托管C++的类和函数。换句话说也就是用托管C++给非托管C++代码做一个外壳包装供C#调用。

托管C++

托管C++已经被废弃,C++托管代码的现代扩展叫做C++/CLI

什么是托管C++ (managed C++)

C++/CLI

C++/CLI 是微软推出的一个跑在 CLI 上的语言,它的主要特性都包含在名字里了:

  1. 语法基于 C++,理论上讲是 C++ 语言的超集,面向 CLI 部分的语法是微软自创的一套新语法。
  2. 目标平台是 CLI。和同门师兄弟 ,C# 和 F# 一样,C++/CLI 以 CLI 平台为目标编译平台,因此天生具有和其他 CLI 语言的互操作性。

C++/CLI 最大的一个优势,是可以直接和原生 C/C++ 代码进行混合编译,使用 C/C++ 的函数和数据结构(被微软称为 mixed mode 编程)。这个优势在进行 .NET 平台和 Native 代码互操作编程时体现的尤其明显。

参考:C++/CLI——想说爱你不容易

编程实现

参考vs2019 实现C#调用c++的dll两种方法

常见报错

1、后面有::的名称一定是类名或者命名空间

出现问题:在托管c++项目中的,InvokeCon.cpp中时 写int InvokeCon.AddCli()报错。

应该是命名空间的问题,

尝试在头文件.h中增加 using namespace System;

更多参考

C#调用C++托管类,实现C#和C++的混合编程

C#调用C++的dll两种方法(托管与非托管)

具有 C++/CLI 互操作层的 Windows 桌面应用程序可以移植到 .NET Core

如何将 C++/CLI 项目移植到 .NET Core

原文地址:https://www.cnblogs.com/peterYong/p/15462980.html