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);
我可以在調試器中看到正確的函數被調用,但傳遞的參數已損壞,顯示的值與傳遞的值完全不同。這也發生在字符串參數上。無論如何要解決託管和非託管代碼之間的參數編組問題?
你不能那樣做...... Init()方法有一個隱含參數,包含MyModule * this。 – xanatos
我想我明白了。那麼,我需要將它變成一個靜態類還是什麼? –
您可以嘗試:從C++中刪除'__cdecl',將'CallingConvention'改爲'CallingConvention.ThisCall',將簽名更改爲'public static extern int Init(IntPtr ptr,int len);'。然後在'ptr'傳遞'MyModule'對象的地址(或'IntPtr.Zero'作爲'null') – xanatos