gpt4 book ai didi

c# - 从 C# : should I pass StringBuilder or use unsafe code? 调用非托管函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:37 26 4
gpt4 key购买 nike

我有一个 C# 程序需要将 char 缓冲区传递给非托管函数。我发现了两种似乎工作可靠的方法,但我不确定应该选择哪一种。

这是非托管函数的签名。

extern "C" __declspec(dllexport) int getNextResponse(char *buffer);

第一个选项是将缓冲区定义为 StringBuilder,如下所示。

//at class level...
[DllImport("mydll.dll")]
static extern int getNextResponse(StringBuilder buffer);

//in main method body...
StringBuilder sb = new StringBuilder(" ", 65536);
int rc = getNextResponse(sb);

这很简单,而且有效,我想我基本上理解它为什么有效,因为 StringBuilder 在幕后有一个缓冲区,所以(我假设)互操作层只是将 StringBuilder 编码为 char *。

另一种选择是使用不安全的代码。

//at class level...
[DllImport("mydll.dll")]
static extern int getNextResponse(byte* buffer);

//separate method...
private static unsafe int runGetNextResponse(byte[] buffer)
{
fixed (byte* p = buffer)
{
int rc = getNextResponse(p);
return rc;
}
}

//in main method body...
byte[] b = new byte[65536];
int rc = runGetNextResponse(b);

第二种方法是更多的代码,但它也更明确地说明了正在发生的事情。

这两种方法基本上做同样的事情吗?有什么理由选择其中之一吗?

最佳答案

我非常喜欢使用 StringBuilder 版本。

两者之间不会有太大区别,使用不安全代码也不会那么干净。

在我看来,既然有一种方法可以使用核心库类来解决问题,那么使用没有明确(和需要)好处的不安全代码是不成熟的优化。

关于c# - 从 C# : should I pass StringBuilder or use unsafe code? 调用非托管函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1687558/

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