首页 > 解决方案 > 从 C# 引用不同的 ActiveX 版本作为一个

问题描述

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

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

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

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

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

先感谢您

标签: c#.netcomactivexsage-erp

解决方案


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

如果这没有帮助,您可以尝试动态创建和访问对象,而不是添加引用。您需要ProgIDCOM 类型中的任何一个……</p>

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

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

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

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

dynamic sage100 = Activator.CreateInstance(comType);

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


推荐阅读