我有一个 C# 程序,需要将字符缓冲区传递给非托管函数。我发现了两种似乎可靠的方法,但我不确定应该选择哪一种。
这是非托管函数的签名。
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 版本。
两者之间不会有巨大差异,并且使用不安全代码也不太干净。
在我看来,既然有一种方法可以使用核心库类来解决问题,那么在没有明确(和需要)好处的情况下使用不安全的代码是一种过早的优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)