将 C# 中的不同 ActiveX 版本作为一个引用

问题描述

在尝试接下来的内容时,我很挣扎。

我目前正在使用 ActiveX,通过 Visual Studio 生成的互操作 dll(更准确地说是 tlbimp,隐式)。

存在此 ActiveX 的不同版本,有时会在界面中添加删除属性。如果要改版本,就得改引用,重新编译等等。

我想要我的代码的单一版本。我记得以驱动 Word 为例,可以通过 Word.Application 上的 CreateInstance 实例化一个单词对象,并调用方法,无论版本如何。调用仅在运行时链接。我想对我使用的 activeX 做同样的事情,但我真的不知道该怎么做(顺便说一句,它是 sage objets100c dll)。我没有在 ActiveX 列表中找到它,因此我什至不确定我可以为 Word.Application 做点什么。

有人知道我该怎么做吗? (可能是完全不同的解决方案,因为我的需要是:拥有一个无需重新编译的代码)。

提前致谢

解决方法

如果您有相应的 *.tlb 文件,请参考此文件,而不是 dll。在引用的属性窗口中,您可以将Specific Version 属性设置为False,将EmbedInterop Types 设置为True(使其更加稳定)。

如果这没有帮助,您可以尝试动态创建和访问对象,而不是添加引用。您需要 COM 类型的 ProgID ...

Type comType = Type.GetTypeFromProgID("MyProg.ProgId");

... 或 COM 类型的 CLSID(您可以在注册表中找到它们)

Type comType = Type.GetTypeFromCLSID(new Guid("EA2BACD6-9D0F-4819-98BC-88E8173D3D16"));

然后您可以使用 Activator.CreateInstance 创建和对象并将其分配给 dynamic 以进行后期绑定。

dynamic sage100 = Activator.CreateInstance(comType);

您将不会获得此 dynamic 对象的智能感知。如果您指定不存在的成员(方法或属性名称),您仍然可以编译和运行您的 C# 代码;但是,当您尝试访问这些成员时,将引发运行时异常。