gpt4 book ai didi

c# - 这个COM接口(interface)可以用C#实现吗?

转载 作者:行者123 更新时间:2023-12-03 23:43:18 25 4
gpt4 key购买 nike

COM 组件目前用 C++ 实现,下一个版本必须用 C# 实现。该组件是从 C++(不是 CLI)代码调用的。不那么小的组件的主要部分已经移植到 C#,但我很难弄清楚如何翻译一种特定的方法。
接口(interface)定义
IDL 中使用了以下导入:

import "oaidl.idl";
import "ocidl.idl";
接口(interface)的主要部分已经翻译成相应的 C# 属性、接口(interface)和类。大多数都可以正常工作。
但是其中一个接口(interface)成员在 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]);
...
}

用法
要使用该接口(interface),本地 TCHAR[10] array 作为数组的名称传递(因此,作为 TCHAR* )。 COM 服务器必须在 TCHAR 数组中放入一个短字符串。
问题
我无法设法调用该方法。 GetShortText 中 C# COM 服务器中设置的断点方法永远不会被击中。 COM 根本找不到我在 .NET 中的实现。
这个以固定大小调用的方法如何 TCHAR*在 C# 中正确实现?

最佳答案

对于这个相当不寻常的构造,我不知道有任何标准编码。但是,您可以执行以下操作:

void GetShortText(int i, [MarshalAs:UnmanagedType.Bool] bool b, IntPtr shortTextPtr)
{
string s = "Test";
byte[] buffer;
if (UseUnicode)
buffer = Encoding.Unicode.GetBytes(s + '\0');
else
buffer = Encoding.Default.GetBytes(s + '\0');
Marshal.Copy(buffer, 0, shortTextPtr, buffer.Length);
}
笔记:
  • 应添加对 buffer.Length 的范围检查(对于 ANSI,<= 10,对于 UNICODE,<= 20)应添加
  • + '\0'用于以 null 终止返回的字符串
  • 关于c# - 这个COM接口(interface)可以用C#实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64442352/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com