如何将 C# 接口的方法参数公开为特定的 COM/ODL 类型?
How to expose a C# interface's method arguments as specific COM/ODL types?
我正在用c#定义一个接口,它将在c#中实现,但从非托管c++模块作为COM对象调用。
我知道我想要/需要的c++ API是什么样子,以及我将如何通过ODL定义它:
//args is an array of BSTR e.g VT_ARRAY|VT_BSTR
HRESULT DoMethod(/*[in]*/BSTR name, /*[in]*/VARIANT args);
我不确定如何在c#中设置此设置以使TLB定义与此匹配,关于VARIANT
。它会像下面这样简单吗?
void DoMethod(string name, string args[])
我一直在环顾四周。. NET互操作文档,但要么我错过了这部分,要么只是不理解所描述的内容!
作为题外话,我怎么能看到什么COM定义正在发出一个给定的c#接口?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选项生成类型库,您可以在c++代码中通过#import指令使用它。这就足够看了,LibraryName。它生成的TLH文件包含声明。或者你可以从Visual Studio命令提示符中运行Oleview.exe,然后使用File> View Typelib查看它。
你最初的本能选择是更好的,string[]在c++端显示为SAFEARRAY*。这样可以减少事故。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 如何在 COM 中对方法执行返回类型
- 在 C# 中加载 COM 对象会引发异常"无法将类型'System.__ComObject'的 COM 对象强制转换为接口类型...",但C++或 VB 不会
- 复杂C++数据类型和 COM
- 如何通过COM公开可为null的类型
- COM:如何在idl中指定特定类型的COM对象作为参数
- c\c++ 中存储 COM VT_DECIMAL的正确类型是什么?
- 如何在基于api的服务器中正确转换和使用本机COM类型
- 如何将 C# 接口的方法参数公开为特定的 COM/ODL 类型?
- 在C++中铸造COM类型
- 通过COM返回自定义接口类型的SAFEARRAY到VB6
- 你认为是什么让这个C++代码变慢了?(它循环通过ADODB记录集,将COM类型转换为字符串,并填充ostringstre