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