2012-10-04 89 views
4

我有一個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,那麼在我之前我有一個漫長而無聊的任務!

+1

嘗試添加'CharSet' –

+0

CharSet是Ansi - 這不能解決順便說一句。似乎我必須返回一個IntPtr,並使用PtrToStringAnsi對其進行編組。不知道它爲什麼在過去有效,但現在不是。 –

+0

也可能與32/64位操作系統更改有關。你的目標架構是什麼? – weismat

回答

3

以前的版本運氣好運。你的代碼一直被破壞。用字符串返回值的P/Invoke編組

  • 副本的背景下新的字符串,
  • 然後調用CoTaskMemFree對本地代碼返回的指針。

無論出於何種原因,您在以前的Windows版本中都會遇到這種情況。但它導致您的最新版本的Windows失敗。

該字符串極有可能在DLL中靜態分配。所以你不應該試圖釋放它。

看起來你有點工作在你面前。

+0

我期待的答案,但希望不要得到! –

相關問題