从C#调用非托管函数:我应该传递StringBuilder还是使用不安全的
发布时间:2020-12-15 17:36:01 所属栏目:百科 来源:网络整理
导读:我有一个C#程序需要将char缓冲区传递给非托管函数.我发现两种似乎可靠的方法,但我不确定我应该选择哪种方式. 这是非托管功能的签名. extern "C" __declspec(dllexport) int getNextResponse(char *buffer); 第一个选项是将缓冲区定义为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版本.
这两者之间不会有太大的区别,使用不安全的代码并不是那么干净. 在我看来,由于有一种方法可以使用核心库类来解决问题,因此使用不安全的代码而没有明确(并且需要)的好处是过早的优化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |