gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:39:48 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com