[英]Problem at marshalling a standard C++ string to a C# string
我正在为管理OCR设备的DLL写包装器。 DLL具有其签名类似于以下内容的方法:
unsigned long aMethod(char **firstParameter, char **secondParameter);
aMethod返回指向所有参数的字符串指针。
我用C#
编写了这个签名...它几乎可以正常工作:
[DllImport(aDll.dll, CallingConvention = CallingConvention.Cdecl,
CharSet = CharSet.Auto)]
static unsafe extern ulong aMethod(ref IntPtr firstParameter,
ref IntPtr secondParameter);
我以这种方式进行调用:
aMethod(ref firstParameter, ref secondParameter);
与字符串相关的编组和解组如下所示:
Marshal.PtrToStringAnsi(firstParameter)
Marshal.PtrToStringAnsi(secondParameter)
显然,根据DLL的API约定选择了这种编组。
现在,编组过程出现了问题。 假设设备具有带有此字符串“ abcdefg”的输入。 如果我使用纯C ++代码中的DLL,则会得到“ abcdefg”作为输出。 但是,如果使用我编写的C#签名,则该字符串将丢失其第一个字符,并且看起来像“ bcdefg”。
怎么了? 如何修复C#方法?
假设从应用程序中为您提供了这些参数,为什么不简单使用:
[DllImport(aDll.dll, CallingConvention = CallingConvention.Cdecl,
CharSet = CharSet.Auto)]
static unsafe extern uint aMethod(out string firstParameter,
out string secondParameter);
如果您希望它们同时使用,则可以使用具有预分配大小的ref StringBuilder
(如果C函数希望您管理自己的内存,则也应使用它-您没有说)。
尝试将CharSet
更改为CharSet = CharSet.Ansi
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.