如何在运行时使用 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 非托管代码?的主要内容,如果未能解决你的问题,请参考以下文章
Pickle 加载模型 ValueError:缓冲区 dtype 不匹配,预期为 'ITYPE_t' 但得到了 'long long'