gpt4 book ai didi

c# - 如何指定是否拥有编码字符串的所有权?

转载 作者:可可西里 更新时间:2023-11-01 18:38:06 26 4
gpt4 key购买 nike

假设我在 C++ 中有 x.dll,它看起来像这样

MYDLLEXPORT
const char* f1()
{
return "Hello";
}

MYDLLEXPORT
const char* f2()
{
char* p = new char[20];
strcpy(p, "Hello");
return p;
}

现在,假设我想在 C# 中使用它

[DllImport("x.dll")]
public static extern string f1();

[DllImport("x.dll")]
public static extern string f2();

有没有办法告诉 CLR 对从 f2 而不是 f1 返回的字符串拥有强所有权?事实是,从 f1 返回的字符串最终将被 GC 释放、删除或其他任何事情这一事实与从 f2 返回的字符串不会被释放、删除或其他任何事情一样糟糕。希望问题很清楚。提前致谢

最佳答案

如果您对 dll 实现有任何影响,那么我强烈建议您不要像示例中那样进行操作。否则,请细化问题以提及该约束。

如果您必须从 dll 返回一个堆分配的字符串,那么您还应该提供一个清理函数(从 dll 导出动态分配的内存时总是好的做法)。您 P/Invoke 分配函数并返回 IntPtr 并使用位于 http://msdn.microsoft.com/en-us/library/atxe881w.aspxMarshal.PtrToString... 之一对其进行编码并通过为事物的 native 端调用清理函数来完成。

另一种方法是使用 BSTR(来自 Marshaling BSTRs in COM/Interop or P/Invoke 的示例):

原生:

__declspec(dllexport)
void bstrtest(BSTR *x)
{
*x = SysAllocString(L"Something");
}

托管:

[DllImport("mydll.dll")]
extern static void bstrtest(ref IntPtr dummy);

static void Main(string[] args)
{
var bstr = IntPtr.Zero;
bstrtest(ref bstr);

var text = Marshal.PtrToStringBSTR(bstr);
Console.WriteLine(text);

Marshal.FreeBSTR(bstr);
}

我刚刚在 SO 上发现了一个类似的问题:PInvoke for C function that returns char *

关于c# - 如何指定是否拥有编码字符串的所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5238025/

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