c# - DllImport、Char*& 和 StringBuilder C/C#

标签 c# dllimport stringbuilder

我有一个问题,我试图查看几乎所有的海报解决方案,但没有找到合适的解决方案。

问题很简单,想要在我的托管 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/

相关文章:

c# - 使用回调调用 MiniDumpWriteDump

c# - 为什么要使用 DllImport 属性而不是添加引用?

java - StringBuilder.append() 导致 java.lang.NullPointerException

java - 为什么 String、StringBuffer 和 StringBuilder 类使用字节数组而不是字符数组来存储字符串的字符?

php - 当 StringBuilder 为 Null 时,它不会继续

c# - 使用工厂时的反射成本

c# - 如何在 C# 中对 Azure 机器学习管道终结点使用服务主体身份验证?

用于 C++ 回调的 C# 委托(delegate)

c# - 如何将 OpenAPI 生成器与公司代理一起使用?

c# - 持续更新的日期时间标签