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

Referencing different ActiveX versions from C# as one

我在尝试以下内容时非常挣扎。

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

存在此 ActiveX 的不同版本,有时会在界面中添加、删除属性。如果我想改变版本,我必须改变参考,重新编译等等。

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

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

提前致谢

如果您有相应的*.tlb 文件,请参考此文件,而不是dll。在引用的属性window中,可以将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 对象的 IntelliSense。如果您指定不存在的成员(方法或 属性 名称),您仍然可以编译和 运行 您的 C# 代码;但是,当您尝试访问这些成员时,将抛出 运行 次异常。