我有一个问题,我试图查看几乎所有的海报解决方案,但没有找到合适的解决方案。
问题很简单,想要在我的托管 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: 尝试读取或写入 protected 内存。这通常表明其他内存已损坏。
所以我需要你的帮助来解决这个问题。
还有一件事,我在 c 中使用 malloc 将内存分配给 char* 变量。
谢谢,
最佳答案
如果你真的想这样做,将参数作为 ref IntPtr
传递,然后调用 Marshal.PtrToStringAnsi ,或类似的。
[DllImport("mydll.dll")]
public static extern IntPtr process_batch(ref IntPtr result);
请注意,由于您在 C 中使用 malloc
分配字符串,.NET 程序将必须跟踪返回的指针,以便它可以将其传回给您以进行释放.否则你会发生内存泄漏。
如果您要传递一个 ref StringBuilder
,您将无法释放由 C 程序分配的内存。
此外,正如有人在另一篇文章中评论的那样,您需要设置调用约定:
[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl)]
关于c# - DllImport、Char*& 和 StringBuilder C/C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6063428/