ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-01-05 13:02:11  阅读:222  来源: 互联网

标签:调用 CLI C# 托管 C++ 编译


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。和同门师兄弟 http://VB.NET,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

标签:调用,CLI,C#,托管,C++,编译
来源: https://www.cnblogs.com/peterYong/p/15462980.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有