【问题标题】:Passing a string from C# to cpp with COM使用 COM 将字符串从 C# 传递给 cpp
【发布时间】:2011-02-11 21:53:28
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这个话题已经变成了一个没有吸引力的投票盛会,答案相互矛盾。我建议您在 MSDN 库中查找 BSTR 和 SysAllocString 的定义并得出自己的结论。

标签: c# c++ com interop string


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

【讨论】:

  • 对我来说听起来好像你已经倒退了。他正在从 C++ 调用 C# COM 组件。
  • @sblom:是的,你的回答让我很困惑。 COM 在两端看起来都一样。自动化始终启用 Unicode。
【解决方案2】:
  1. 没有。
  2. 是的。如果您想将字符串作为 ANSI 字符串而不是 Unicode 返回,请将 the attribute [return: MarshalAs(UnmanagedType.LPStr)] 放在 C# 中的方法定义之前。
  3. 是的——作者可能这样做是为了通过回避默认编组行为来保持对字符串内容编码的非常细粒度的控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多