【发布时间】:2021-02-03 02:46:43
【问题描述】:
COM 组件当前是用 C++ 实现的,下一个版本必须用 C# 实现。该组件是从 C++(不是 CLI)代码调用的。不是那么小的组件的主要部分已经移植到 C#,但我很难弄清楚如何翻译一种特定的方法。
接口定义
IDL 中使用了以下导入:
import "oaidl.idl";
import "ocidl.idl";
接口的主要部分已经翻译成相应的C#属性、接口和类。大部分都可以正常工作。
但其中一个接口成员在 IDL 中定义为
[
object,
uuid(<guid>),
helpstring("Help"),
pointer_default(unique)
]
interface IStuff : IUnknown
{
...
HRESULT GetShortText([in] int i, [in] BOOL b, [out, string] TCHAR shortText[10]);
...
}
用法
要使用该接口,将本地TCHAR[10] 数组作为数组名称传递(因此,作为TCHAR*)。 COM 服务器必须在 TCHAR 数组中放入一个短字符串。
问题
我无法调用该方法。在 C# COM 服务器中以 GetShortText 方法设置的断点永远不会被命中。 COM 根本找不到我在 .NET 中的实现。
这个以固定大小TCHAR* 调用的方法如何在 C# 中正确实现?
【问题讨论】:
-
“短字符串”是什么意思? Short 通常是 int16。 TCHAR 也称为 WCHAR(W 表示宽),它是一个 unicode 字符串。所以我认为问题是从 UTF-8 编码字符串到 unicode 字符串。在 c# 中,字符串是一个类,其中字符是一个字节或两个字节,并且是一个受保护的属性,指示字符是一个字节还是两个字节。因此,要将 c# 类字符串转换为 TCHAR,您需要使用编码 1) byte[] bytes Encoding.Unicode.GetBytes(string) 2) string s = Encoding.Unicode.GetString(bytes)
-
我不完全清楚 C# 代码是否应该调用此方法或实现它。此外,TCHAR 可以是 char 或 wchar_t,具体取决于您如何编译 C++ 代码。这也需要修复并让 C# 代码知道。
-
@jdweng 和一个 short 字符串我的意思是只有几个字符(C++ 中的 TCHAR 类型),而不是一系列短裤。问题是如何将 TCHAR* 编组为 .NET。我还没有在 C# 中尝试过 byte[] 。感谢您的建议。
-
@KlausGütter C# 应该实现这个。可以让 C# 实现知道使用的是 char 还是 wchar_t。两者确实是可能的。使用 COM 接口的 C++ 应用程序有 unicode 和非 unicode 变体。
-
作为最后的手段,您可以使用
GetShortText(int i, [MarshalAs:UnmanagedType.Bool] bool b, IntPtr shortTextPtr),然后使用Marshal类中的方法将字符填充到缓冲区中。
标签: c# .net com com-interop idl