作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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/
我是一名优秀的程序员,十分优秀!