问题描述
在尝试接下来的内容时,我很挣扎。
我目前正在使用 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# 代码;但是,当您尝试访问这些成员时,将引发运行时异常。