C#調用C++ dll全解析, 基本數據

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章