2013-07-12 113 views
1

我有一個供應商的DLL,我需要從C#調用。我知道C#數據類不直接與C++數據類型兼容。從C#.NET調用非託管DLL所需的教程

因此,鑑於我有一個函數接收數據並返回一個「字符串」。

(像這樣)

string answer = CreateCode2(int, string1, uint32, string2, uint16); 

我必須做什麼,以使輸入參數兼容,然後進行結果字符串兼容?

請 - 我從來沒有這樣做:不要給出像「使用P/Invoke」或「使用元帥」的答案我需要一個帶有示例的教程。

我看到的所有P/Invoke示例都來自.NET Framework 1.1,Marshall(沒有教程)完全讓我困惑。

另外,我看到了一些例子,告訴我什麼時候創建我的extern函數來用void *替換所有的數據類型。這使得我的IDE要求我使用「不安全」。

回答

5

這還不是很一個教程,但它有很多很好的信息,使用P/Invoke Calling Win32 DLLs in C# with P/Invoke
它會給你的術語的概念,基本概念,如何使用的DllImport和應足以讓你走。

有一個關於MSDN的教程:Platform Invoke Tutorial
但它很短,說實話,我上面提到的是一個更好的信息來源,但有很多的信息。

另外有用的是PInvoke簽名工具包,描述爲here
並可下載here
它允許您粘貼非託管方法簽名或結構定義,它會爲您提供.NET P/Invoke等效項。這不是100%完美的,但它會讓你比想象自己的事情快得多。

關於編組具體,我會說開始簡單。 如果你已經有了某種指針,而不是試圖用方法簽名將它直接轉換爲方法簽名中的某些.NET類型,有時可以更簡單地將它作爲IntPtr對待,然後使用Marshal.Copy, .PtrToString,.PtrToStructure和其他類似的將數據轉換爲.NET類型的方法。
然後,當您掌握整個事情時,您可以使用Marshal屬性直接轉換。

關於編組here,herehere有一個很好的3部分組合文章。

+0

您帖子中的部分鏈接已損壞。 – Shimmy

+1

感謝@Shimmy的負責人,鏈接已更新。 – Nanhydrin