4

我有一个通过 PInvoke 使用本机 dll 的 C# 项目。迄今为止,我一直在 XP 和 Windows 8 消费者预览版上使用 VS2010 开发该项目。

我已经更新到 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,并手动执行编组,那么我面前就有一个漫长而无聊的任务!

4

1 回答 1

3

以前的版本很幸运。您的代码一直被破坏。使用字符串返回值 p/invoke marshaller

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

无论出于何种原因,您在以前版本的 Windows 上都摆脱了这种情况。但这会导致您最新版本的 Windows 出现故障。

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

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

于 2012-10-04T13:15:28.493 回答