升级到VS 2012后,PInvoke停止工作

时间:2012-10-04 12:26:31

标签: c# interop pinvoke marshalling

我有一个C#项目,它通过PInvoke使用本机dll。到目前为止,我一直在使用VS2010开发XP和Windows 8 Consumer预览版的项目。

我已经更新到Windows 8版本和VS2012。我打到第一个PInvoke时,同一个项目现在崩溃了。 C声明是:

const char * func(void);

C#P / Invoke声明:

    [DllImport("libspotify.dll",CharSet = CharSet.Ansi)]
    internal static extern string sp_build_id();

调用约定是stdcall。现在,这种安排一直很好,我的理解是const char *会自动被编组成一个字符串。但是,在Windows 8上从VS2012运行时,这会崩溃。如果我更改C#声明以返回IntPtr,它就可以工作。

以前的版本是否运气,或代码是否正常?有什么理由不再有效吗?如果我需要将我的所有字符串声明更改为IntPtrs,并手动执行Marshaling,那么我面前有一项漫长而无聊的任务!

1 个答案:

答案 0 :(得分:3)

以前的版本运气好。你的代码一直都被打破了。使用字符串返回值p / invoke marshaller

  • 将上下文复制到新字符串
  • 然后在本机代码返回的指针上调用CoTaskMemFree

无论出于何种原因,您在以前的Windows版本中都可以使用它。但它导致您最新版本的Windows失败。

这个字符串很可能会在DLL中静态分配。所以你不应该试图释放它。

看起来你还有一些工作要做。