个人记录在c#中调用c++ 的dll

本文介绍了在C#中如何通过P/Invoke调用来调用C++的DLL。详细讨论了C++中导出函数的声明,C#中的DllImport用法,以及利用dumpbin工具解析DLL接口。文中还提到了C++ Interop和COM Interop,但指出在本场景下,P/Invoke是最佳选择,并对比了MoveWindow和SetWindowPos函数在调整窗口位置时的区别。
摘要由CSDN通过智能技术生成

C#是运行在CLR之上被托管的,而C++则并没有被托管。
目前.Net平台中托管环境调用非托管环境有三种方法:

①P/Invoke
②C++ Interop
③COM Interop

这三种方法当中,C++ Interop是针对托管C++使用的方法(微软自己弄的一套C++,语法和传统c++很不一样),COM Interop则是针对Window软件开发而采用的方式。所以我们只剩下一种解决方案:也就是PInvoke来进行托管环境与非托管环境的互操作。

在c++中这样写:

_declspec(dllexport) int add (int a, int b)
{
      return a + b;
}

_declspec(dllexport) int subtract (int a, int b)
{
      return a - b;
}

__declspec(dllexport)代表需要导出的函数,需要放在函数定义的前面。

在c#中这些写:


using System.Runtime.InteropServices;
[DllImport("use_c++.dll",EntryPoint = "?add@@YAHHH@Z")]
        public static extern int add(int x, int y);

c++编译器为了支持重载,所以在编译的时候给每一个接口都重新定义了唯一的名字,这个过程被称为“名字粉碎”。这个名字就是dll找到接口的入口地址。

?我们使用vs自带的工具d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值