C# 調用 C++ DLL方法


在C# 中,可以通過 DllImport 調用C++ 的非托管DLL程序。

VS2010中C#調用C++的DLL示例:

一、新建C++ DLL程序

1、新建 C++ Win32項目,類型為DLL。

生成的文件結構如圖:

 

 其中,“MyDLLFun.cpp”文件為此項目主要源文件。

2、在源文件中添加需要被外部調用的方法。

這里僅僅是添加兩個示例方法:

方法“Add”返回兩個整數的和;方法Pow計算X 的 Y 次方,並以指針的形式修改參數 x 地址處的值。

修飾符 extern "C" 包含雙重含義:首先,被它修飾的目標是“extern”的;其次,被它修飾的目標是“C”的。而被extern "C"修飾的變量和函數是按照C語言方式編譯和連接的。

  __declspec(dllexport)的目的是為了將對應的函數放入到DLL動態庫中。

 extern "C" __declspec(dllexport)加起來的目的是為了使用DllImport調用非托管C++的DLL文件。因為使用DllImport只能調用由C語言函數做成的DLL。

添加完方法后,編譯生成DLL文件。

二、在C#中使用DLL程序。

首先,將新生成的都來了拷貝到C#工程bin\Debug目錄下。

然后,利用DllImport導入DLL程序中的方法,為方便管理,新建一個名為CppDll的類,並在此導入DLL方法:

說明:1)需要引用命名空間 using System.Runtime.InteropServices;

   2)建議增加特性 CallingConvention= CallingConvention.Cdecl,不然可能會出現 “堆棧不對稱”錯誤:

        

   3)DLL中的方法,必須申明為 static,extern 的。

最后,在需要的地方調用這些方法即可。

說明:C++中函數Pow中傳的為指針,也即是變量的地址,在C#修飾符 ref 即表示“傳址”,所以C++中的 int*對應於 C#中的ref int

三、稍微擴展一下,在函數中傳遞數組。

在C++中添加函數

在C++中,函數參數為數組時傳遞的為數組的首地址,和數組的長度,如上。那么對應於C#中就應該是:

其中 ref double ary 為某個double類型數組的第一個元素的地址,len為數組長度。

調用時則寫為:

 

 懶一點,就用一個字符串查看結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM