在c#呼叫c dll互操作中,c dll中的函式可能會有些多級指標作為引數或者返回值的情況,
本文的目的就是提供一種安全情況下,.net對於c dll的呼叫想法,之所以叫想法,是因為這個方法
首先,關於.net(c#)如何呼叫c dll的基本方法,詳見此文。
我的環境為vs2015 community版本。
首先建立在你的解決方案新增兩個控制台專案,它們分別為乙個c#,c++控制台:
其中c++控制台專案建立時請選擇控制台的dll專案.而非預設的控制台專案。
在你的c++控制台專案中新增兩個檔案:mydll.cpp,mydll.h,內容如下:
mydll.cpp
#include "stdafx.h"
#include "mydll.h"//貌似這兩個標頭檔案的順序不能顛倒。我試了很多次,但是不能確定。
#include "stdlib.h"
int statenum = 0;//全域性狀態量。
//mystruct定義在mydll.h中
/*以下為五種級別的結構體指標函式定義*/
mystruct getstruct(mystruct st)
mystruct* getstruct1(mystruct *st)
mystruct** getstruct2(mystruct **st)
mystruct*** getstruct3(mystruct ***st)
mystruct**** getstruct4(mystruct ****st)
mydll.h如下:
#ifndef lib_h
#define lib_h
typedef struct mystruct mystruct;
extern "c" _declspec(dllexport) mystruct getstruct(mystruct st);
extern "c" _declspec(dllexport) mystruct* getstruct1(mystruct *st);
extern "c" _declspec(dllexport) mystruct** getstruct2(mystruct **st);
extern "c" _declspec(dllexport) mystruct*** getstruct3(mystruct ***st);
extern "c" _declspec(dllexport) mystruct**** getstruct4(mystruct ****st);
#endif
c#專案program.cs編輯如下;
using system;
using system.runtime.interopservices;
namespace cdllinvoker
class program
return ptr;
}catch (exception ex)
}//其中level為傳入指標的級別;
其中,值得注意的是,當呼叫指標級別大於2時,有可能會出項錯誤,具體原因尚不清楚:
這裡我推薦的方法是,若當你所需要的指標級別大於3時,請使用ref+低一級的指標,
以減少出現上述錯誤的可能。
比如若你想使用如上的mystruct*** getstruct(mystruct ***st);
你可以使用如下的方法;
var ptr = getptrfromstructure(st, 2);
getstruct3(ref ptr);
st = getstructurefromptr(ptr, 2);
console.writeline(st.myval);
當然,在program.cs中定義的getstruct3方法也需要改變引數為ref intptr;
在乙個解決方案中用C 測試呼叫C DLL
vs2015,在解決方案中新建乙個c dll專案,乙個c winform專案 這個是自動生成 case dll x x,這幾個是dll訊息 stdafx標頭檔案和c檔案不用管 dlltest2.cpp裡面新增3個函式 include stdafx.h include dlltest2.h inclu...
C 呼叫操作Excel的乙個類
在這兒本來想寫長一點的文章,但因為時間的關係,沒有寫成。現把自己做的乙個小東西,c 呼叫excel作報表的源 放在這兒給大家看看。關於 的構成,在源 中已經有完整的 注釋了,這兒就不說什麼了。下面的這個類中,主要完成的功能是從資料庫 中逐字段讀出資料,設定格式後,在excel中顯示出來。這是它執行後...
C 呼叫操作Excel的乙個類
在這兒本來想寫長一點的文章,但因為時間的關係,沒有寫成。現把自己做的乙個小東西,c 呼叫excel作報表的源 放在這兒給大家看看。關於 的構成,在源 中已經有完整的 注釋了,這兒就不說什麼了。下面的這個類中,主要完成的功能是從資料庫中逐字段讀出資料,設定格式後,在excel中顯示出來。這是它執行後的...