我有一个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,那么我面前有一项漫长而无聊的任务!
答案 0 :(得分:3)
以前的版本运气好。你的代码一直都被打破了。使用字符串返回值p / invoke marshaller
CoTaskMemFree
。 无论出于何种原因,您在以前的Windows版本中都可以使用它。但它导致您最新版本的Windows失败。
这个字符串很可能会在DLL中静态分配。所以你不应该试图释放它。
看起来你还有一些工作要做。