我有一個C#項目,通過PInvoke使用本機DLL。迄今爲止,我一直在XP和Windows 8 Consumer預覽版上使用VS2010開發項目。升級到VS 2012後PInvoke停止工作
我已經更新到Windows 8版本和VS2012。當我打我的第一個PInvoke時,同樣的項目現在崩潰了。 C定義是:
const char * func(void);
的C#的P/Invoke declartion:
[DllImport("libspotify.dll",CharSet = CharSet.Ansi)]
internal static extern string sp_build_id();
調用約定是STDCALL。現在,這種安排一直運行良好,我的理解是const char *會自動被封送到一個字符串。但是,從Windows 8上的VS2012運行時,會崩潰。如果我改變C#聲明返回一個IntPtr,它的工作原理。
以前的版本是否運行正常,或者代碼是否正常?這有什麼理由不再有效嗎?如果我需要將所有的字符串聲明更改爲IntPtrs,並手動執行Marshaling,那麼在我之前我有一個漫長而無聊的任務!
嘗試添加'CharSet' –
CharSet是Ansi - 這不能解決順便說一句。似乎我必須返回一個IntPtr,並使用PtrToStringAnsi對其進行編組。不知道它爲什麼在過去有效,但現在不是。 –
也可能與32/64位操作系統更改有關。你的目標架構是什麼? – weismat