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函數)的調用。
下載代碼,請點擊此處。