繁体   English   中英

将标准C ++字符串编组为C#字符串时出现问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM