0

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

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

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

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

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

先感谢您

4

1 回答 1

1

如果您有相应的 *.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# 代码;但是,当您尝试访问这些成员时,将引发运行时异常。

于 2021-03-01T14:25:51.510 回答