gpt4 book ai didi

c# - 在 P/Invoke 中为固定字符串传递什么?

转载 作者:太空狗 更新时间:2023-10-29 23:01:23 24 4
gpt4 key购买 nike

假设这个 C 函数:

void do_something(const char* str)

它将字符串存储在某处以供以后引用

此外,我在 C# 中有这个签名来调用这个函数:

[DllImport("NativeLib")]
static extern void do_something(string str);

现在,将字符串传递给此方法时我需要做什么:

  • 我是否需要固定字符串(使用 GCHandle.Alloc())(或者编码器正在创建一个副本)?
  • 如果我确实需要固定它,我是否传递“原始”字符串(即我传递给 GCHandle.Alloc() 的字符串)?或者我是否需要传递 GCHandle.AddrOfPinnedObject() 的返回值?
  • 在这种情况下,string 是正确的数据类型吗(对于 do_something)?或者我应该改用 IntPtr 吗?

最佳答案

通过互操作边界存储指针是一个非常糟糕的主意,尽一切可能修改 C 代码以制作字符串的副本。

按照投票答案中的建议固定字符串是行不通的,pinvoke 编码器必须将字符串转换为 char* 并在进行 native 调用后释放转换后的字符串,使指针无效。您必须自己编码字符串。将参数声明为 IntPtr 并使用 Marshal.StringToHGlobalAnsi() 创建指针值。

或者使用 Marshal.StringToCoTaskMemAnsi(),它从 COM 堆中分配。这是你真正的问题,没有很好的方案来释放字符串。 C 代码无法释放该字符串,因为它不知道它是如何分配的。您的 C# 代码无法释放字符串,因为它不知道 C 代码何时使用指针完成。这就是复制字符串如此重要的原因。如果您只进行几次此调用,您可以忍受内存泄漏。

关于c# - 在 P/Invoke 中为固定字符串传递什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10977231/

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