使用COM将字符串从C#传递到cpp

时间:2010-04-24 16:37:55

标签: c# c++ com interop string

我有一个C#COM服务器,由cpp客户端使用。

其中一个C#方法返回一个字符串。

在cpp中,返回的字符串以Unicode(UTF-16)表示,至少根据内存视图。

  1. COM字符串总是这样吗?
  2. 有没有办法改用UTF-8?
  3. 我看到了一些代码,其中字符串在cpp和c#之间传递为字节数组。这有什么好处吗?

2 个答案:

答案 0 :(得分:1)

  1. 是。标准COM字符串类型是BSTR。它是以UTF16编码的Unicode字符串,就像Windows的本机字符串类型一样。
  2. 不,COM方法不会理解UTF8字符串,它会把它变成中文。 UTF8是一个很好的文本文件编码,不适用于操作内存中字符串的程序。 UTF8需要1到4个字节之间的任何值来编码Unicode代码点。与基本字符串操作非常不兼容,例如获取大小或索引字符。
  3. C和C ++程序倾向于使用8位编码,与“char”类型兼容。这是一种古老的做法,可以追溯到Unicode出现之前的一个时代。它没什么吸引力,有许多 8位编码。典型的问题是,如果由使用相同8位编码的程序读取,则只能正确解释作为文本输入的数据。换句话说,当计算机相距不到1000英里时。在欧洲较少。

答案 1 :(得分:0)

  1. 没有
  2. 是。如果您希望将字符串作为ANSI字符串而不是Unicode返回,请将the attribute [return: MarshalAs(UnmanagedType.LPStr)]放在C#中的方法定义之前。
  3. 是的 - 作者可能已经这样做,通过侧面步进默认的编组行为来保持对字符串内容编码的非常细粒度的控制。