2015-06-16 98 views
1

已嘗試整天搜索各種源,但找不到解決方案。我從c#調用一個導入的非託管dll函數。將參數從C#傳遞到非託管dll後不正確

C++類的樣子:

class MyModule 
{ 
public: 
    MYMODULEDLL_API int __cdecl Init(int); 
... 

在C#中這樣定義:

[DllImport("MyModule_x64.dll", EntryPoint = 
    "[email protected]@@[email protected]", CallingConvention = CallingConvention.Cdecl)] 
    public static extern int Init(int len); 

,並呼籲像這樣:

Init(configFileName.Length); 

我可以在調試器中看到正確的函數被調用,但傳遞的參數已損壞,顯示的值與傳遞的值完全不同。這也發生在字符串參數上。無論如何要解決託管和非託管代碼之間的參數編組問題?

+1

你不能那樣做...... Init()方法有一個隱含參數,包含MyModule * this。 – xanatos

+0

我想我明白了。那麼,我需要將它變成一個靜態類還是什麼? –

+0

您可以嘗試:從C++中刪除'__cdecl',將'CallingConvention'改爲'CallingConvention.ThisCall',將簽名更改爲'public static extern int Init(IntPtr ptr,int len);'。然後在'ptr'傳遞'MyModule'對象的地址(或'IntPtr.Zero'作爲'null') – xanatos

回答

0

您不能使用使用DLLImport或PINVOKE的C++類,因爲它僅適用於C風格的函數。

如果您想在C#中使用C++類,則需要使用C++/CLI。您可以使用本機C++創建一個非託管dll,然後創建一個簡單的C++/CLI包裝器,它可以從本機dll調用方法。之後,您可以簡單地將C++/CLI託管的dll添加到項目中,並將其用作C#類,而不使用任何DllImport和PINVOKE。這將是一個非常靈活的soltuion,很容易擴展。在MSDN上,您可以找到如何使用C++/CLI的示例。

相關問題