2009-01-30 81 views
3

我有一個C語言編寫的傳統DLL,我想從C#.NET應用程序調用。問題是C DLL的DLL接口相當複雜。這件事情是這樣的:從C DLL到.NET的接口

__declspec(dllexport) void __stdcall ProcessChunk(
    void *p_prochdl, 
    const BIG_INPUT_STRC *p_inparams, 
    BIG_OUTPUT_STRC *p_outparams 
); 

的BIG_INPUT_STRC/BIG_OUTPUT_STRC包含各種東西......指針數組緩衝,列舉的參數,整型參數,等等,總之,他們是複雜的。

第一個問題:是否有一種簡單的方法可以將DLL頭文件中包含的所有結構信息獲取到C#類中,還是需要將所有內容從字面上複製並粘貼到C#並重新定義它?這似乎是多餘的。

與此相關,什麼是正確的方式將結構從C#傳遞到非託管DLL?

最後,有沒有一個如何正確地將緩衝區數組從C#傳遞到非託管DLL的例子?或者,我怎樣才能傳遞一個二維數組到DLL中?

感謝, -Greg

回答

3

它很直截了當地使用P/Invoke做這個軟的東西在C#。

我相信你將不得不手動定義C#中的數據結構。

我會建議你看看這個MSDN article關於這個問題

2

你需要大量使用.net marshalling。首先,您需要在C#代碼中重新定義C結構,然後使用MarshalAs屬性確保所有內容都能正確使用。

如果您需要將C#中的指針結構傳遞迴C函數,則可以使用Marshal.StructToPtr函數。

緩存陣列,假設他們定義爲字節[]你可以使用以下技術名帥:

byte[] buffer = ...; 
fixed(byte *pBuffer = buffer) 
{ 
    // do something with the pBuffer 
} 

fixed語句可確保bufffer沒有得到在內存由垃圾感動收集器,使指針位於「固定」或「固定」的語句中。

對於多維數組,它依賴於底層的C實現,例如,您可以使用指向數組的指針並根據維數和每個維度中元素的數量調整位置,如下所示:

someValue = buffer[(elementsPerDimensions * x) + y]; 

從您的描述看,它已經看起來相當複雜了,你有沒有考慮讓你的庫COM友好?

0

什麼藥丸。

  1. 我會避免試圖使圖書館COM友好。這比它的價值更麻煩。

  2. 我會構建第二個本地函數庫,其函數設計爲P/INVOKED來爲第一個函數創建記錄並調用它。

或者,您可以使C++本機/託管庫來處理編組。

+0

避免COM爲什麼?互操作性非常好,幾乎沒有需要做的事情,但導入接口。 – arul 2009-01-30 04:28:56