在 C# 中使用 COM ActiveX DLL 而不引用它

砖块

我正在开发一个使用第三方 COM ActiveX Dll 的小型开源项目,该项目我无法分发(因此无法参考)。有没有一种简单的方法可以在我的项目中使用这个 DLL 而无需引用它(System.Reflection Assembly 似乎不适用于 COM/ActiveX)?或者我应该将它视为带有 [DllImport] 的非托管 dll 吗?

谢谢

尤金·阿斯塔菲耶夫

有没有一种简单的方法可以在我的项目中使用这个 DLL 而无需引用它(System.Reflection Assembly 似乎不适用于 COM/ActiveX)?

不。

或者我应该将它视为带有 [DllImport] 的非托管 dll 吗?

通常DllImport用于导出的功能,如 Windows API,但不适用于 COM 服务器或 ActiveX 组件。

平台调用是一种服务,它使托管代码能够调用在动态链接库 (DLL) 中实现的非托管函数,例如 Windows API 中的那些函数。它定位并调用导出的函数,并根据需要跨互操作边界编组其参数(整数、字符串、数组、结构等)。

互操作性使您能够保留和利用对非托管代码的现有投资。在公共语言运行时 (CLR) 控制下运行的代码称为托管代码,在 CLR 之外运行的代码称为非托管代码。COM、COM+、C++ 组件、ActiveX 组件和 Microsoft Windows API 是非托管代码的示例。

.NET Framework 通过平台调用服务、System.Runtime.InteropServices 命名空间、C++ 互操作性和 COM 互操作性(COM 互操作)实现与非托管代码的互操作性。

平台调用依赖于元数据来定位导出的函数并在运行时编组它们的参数。下图显示了此过程。

在此处输入图片说明

从 .NET Framework 4 开始,公共语言运行库支持将 COM 类型的类型信息直接嵌入到托管程序集,而不是要求托管程序集从互操作程序集获取 COM 类型的类型信息。由于嵌入的类型信息仅包括托管程序集实际使用的类型和成员,因此两个托管程序集可能具有相同 COM 类型的截然不同的视图。每个托管程序集都有一个不同的 Type 对象来表示其 COM 类型的视图。公共语言运行时支持接口、结构、枚举和委托的这些不同视图之间的类型等效。

类型等效意味着从一个托管程序集传递到另一个托管程序集的 COM 对象可以转换为接收程序集中的适当托管类型。

在 MSDN互操作性(C# 编程指南)部分阅读更多相关信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章