C#是托管语言(Managed language),运行在CLR下。C++是非托管语言(UnManaged language)。托管语言和非托管语言的区别在于托管语言本身做了许多服务,封装很多操作,比如内存自动回收,运行库类型检查,安全类型等。Win32程序使用C++语言,Windows Sdk提供的功能都是封装在c++ dll文件中,比如最最重要的三大功能的dll(kernel32.dll、user32.dll、gdi32.dll)。在我们开发win32程序操作数据的输入输出、窗口消息和GUI的时候会经常使用这三个dll的导出接口。C#对于常用库函数的处理是非常到位的,但是项目需求时而不时会用到Win32相应的功能,不可避免需要调用C++ dll导出接口。不管是系统的导出接口,其他程序的导出接口。
*那么怎么调用呢?*
方案1、封装com,提供给c#程序调用,无奈这种写的复杂使用简单的方案越来越不被人们使用;
方案2、使用P/Invoke,一套完整InterOP方案完成托管语言与非托管语言的交互;
这里使用方案2
系列:
C#调用C++ dll全解析,基本数据类型
C#调用C++ dll全解析,指针
C#调用C++ dll全解析,结构体
C#调用C++ dll全解析,函数指针
C#调用C++ dll全解析,回调函数和复杂数据类型
C#调用C++ dll全解析,非安全代码
基本类型的调用:
一、新建win32 dll工程pinvoke_dll.dll,提供add函数作为导出接口
1、win32 dll工程 声明:
extern "C"
{
__declspec(dllexport) __int32 add(__int32 a, __int32 b);
}
2、win32 dll工程 实现:
__declspec(dllexport) __int32 add(__int32 a, __int32 b)
{
return a+b;
}
3、win32 dll工程 def文件:
LIBRARY pinvoke_dll
EXPORTS
add
二、新建C#工程pinvoke_CSharpe,调用上面输出的C++ dll工程(pinvoke_dll.dll)接口
1、声明dll的导出函数
public class pinvoke_dll
{
[DllImport("pinvoke_dll")]
public extern static UInt32 add(UInt32 a, UInt32 b);
}
2、调用add函数,完成调用
UInt32 res = pinvoke_dll.add(1,2);
以上完成C#程序对C++ dll导出接口(add函数)的调用。
下载代码,请点击此处。