从C#调用非托管函数:我应该传递StringBuilder还是使用不安全的代码?

我有一个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在幕后有一个缓冲区,所以(我假设)interop层只是将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版本.

这两者之间不会有太大的区别,使用不安全的代码并不是那么干净.

在我看来,由于有一种方法可以使用核心库类来解决问题,因此使用不安全的代码而没有明确(并且需要)的好处是过早的优化.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...