我有一个问题,我尝试查看几乎所有的海报解决方案,但未能找到合适的解决方案。
问题很简单,想要在我的托管 C# 中从非托管 C 代码返回字符串。
c 函数为:
extern "C" __declspec(dllexport) int process_batch (char *&result);
在 C# 中我导入了 DLL:
[DllImport("mydll.dll")]
public static extern IntPtr process_batch(StringBuilder result);
我运行了,但是我的StringBuilder中的返回值是一个7-8个无意义的字符串! (我认为是内存地址)
我尝试在 StringBuilder 之前添加 ref ,这次我在 StringBuilder 中获得了正确的返回值,但得到了 AccessViolationException :
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
所以我需要你的帮助来解决这个问题。
还有一件事,我在 c 中使用 malloc 将内存分配给 char* 变量。
Thanks,
如果您确实想这样做,请将参数作为ref IntPtr
,然后调用Marshal.PtrToStringAnsi http://msdn.microsoft.com/en-us/library/7b620dhe.aspx,或类似的。
[DllImport("mydll.dll")]
public static extern IntPtr process_batch(ref IntPtr result);
请注意,因为您正在分配字符串malloc
在 C 中,.NET 程序必须跟踪返回的指针,以便它可以将其传递回给您以进行释放。否则你会出现内存泄漏。
如果你要通过ref StringBuilder
,您将无法释放 C 程序分配的内存。
另外,正如有人在另一篇文章中评论的那样,您需要设置调用约定:
[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl)]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)