gpt4 book ai didi

c# - 如何将 C# 接口(interface)的方法参数公开为特定的 COM/ODL 类型?

转载 作者:行者123 更新时间:2023-11-28 06:02:22 25 4
gpt4 key购买 nike

我在 C# 中定义一个接口(interface),它将在 C# 中实现,但作为 COM 对象从非托管 C++ 模块调用。

我知道我想要/需要 C++ API 是什么样子以及我如何通过 ODL 定义它:

//args is an array of BSTR e.g VT_ARRAY|VT_BSTR
HRESULT DoMethod(/*[in]*/BSTR name, /*[in]*/VARIANT args);

关于 VARIANT,我不确定如何在 C# 中进行设置以使 TLB 定义与之匹配。可以像下面这样简单吗?

void DoMethod(string name, string args[])

我一直在查看 COM/.NET 互操作文档,但要么我错过了这部分内容,要么根本不理解其中的描述!

顺便说一句,我如何才能看到为给定的 C# 接口(interface)发出的 COM 定义? DLL/TLB 是否易于检查?

最佳答案

如果你想要 C++ 端的变体(为什么?),那么你需要声明它:

using System.Runtime.InteropServices;

namespace LibraryName {
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IFoo {
void DoMethod(string name, object args);
}
}

使用 Regasm.exe/codebase/tlb 注册 C# 程序集。/tlb 选项生成类型库,您可以通过#import 指令在 C++ 代码中使用它。看看就够了,它生成的 LibraryName.tlh 文件有声明。或者您可以从 Visual Studio 命令提示符运行 Oleview.exe 并使用文件 > 查看类型库来查看它。

您最初的直觉选择更好,string[] 在 C++ 端显示为 SAFEARRAY*。这样可以减少事故。

关于c# - 如何将 C# 接口(interface)的方法参数公开为特定的 COM/ODL 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32995665/

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