如何在运行时使用 ITypeLib 和 ITypeInfo 从 C#.NET 调用 COM 非托管代码?

Posted

技术标签:

【中文标题】如何在运行时使用 ITypeLib 和 ITypeInfo 从 C#.NET 调用 COM 非托管代码?【英文标题】:How to Call COM unmanaged code at Runtime from C#.NET using ITypeLib and ITypeInfo? 【发布时间】:2011-02-19 04:02:01 【问题描述】:

我需要从 C#.NET 调用非托管 COM 代码。通过从 (LoadTypeLibEx) 加载非托管 COM 类型库,我能够通过 COM TLB 遍历所有公开的类型。我需要知道在运行时调用这些公开方法的地址,或者通过访问 COM vtable 的起始地址并应用索引来获取接口下这些公开方法的地址。

【问题讨论】:

How to access COM vtable and acess its entries from TLB(Type Library) in C#?的可能重复 是的,因为我的问题没有得到正确的解决方案,我从另一个好方法重新打开了线程。 【参考方案1】:

只是一个建议:

创建一个代理非托管 COM 服务器,它只使用一组固定的方法来为您完成这项工作,而不是在您的 c# 应用程序中使用此代理服务

【讨论】:

编写代理非托管 COM 服务器非常困难。我不需要为每个作为 DLL/EXE 的非托管二进制文件的 COM EXE/DLL 生成代码。我只需要在运行时枚举所有类型及其公开的方法,并且在运行时我需要通过从 vtable 访问它们的地址来调用公开的方法。无代码生成 只有一个 com 服务器,但能够枚举请求的 dll 的所有类型和方法。使用 ATL 枚举 COM 对象 (IDispatch) 方法? ***.com/questions/2112302/… 我的想法是你可以用非托管代码做到这一点,然后通过 COM 接口将此信息提供给 c# 客户端 其实我在 System.Runtime 下找到了 InterOpServices 命名空间。这使您能够准确枚举非托管二进制文件中包含的所有类型。那么为什么要使用非托管代码来编写这个。我希望最大限度地利用 .NET 功能。只剩下一件事了。只是在运行时使用我正在搜索的地址调用这些函数...

以上是关于如何在运行时使用 ITypeLib 和 ITypeInfo 从 C#.NET 调用 COM 非托管代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何声明具有相同主体的 2 个接口?

代码重构 & JDT判断一个类IType是否有子类

Pickle 加载模型 ValueError:缓冲区 dtype 不匹配,预期为 'ITYPE_t' 但得到了 'long long'

iType.js仿输入文字效果

有啥方法可以让 curl 连接并让我在输入时输入和发送身体片段?

如何在 C# 中使用 TaskScheduler 设置“仅在登录时运行”和“运行方式”?