当我试图理解下面的内容时,我很挣扎。
我目前正在使用ActiveX,通过Visual Studio生成的互操作dll(更准确地说是tlbimp,隐式)。
存在不同版本的ActiveX,有时会在接口中添加、删除属性。如果我想更改版本,我必须更改引用,重新编译等等。
我想有一个单一版本的代码。例如,我记得要驱动Word,可以通过Word上的CreateInstance实例化一个Word对象。应用程序和调用方法,无论版本如何。仅在运行时链接调用。我想和我使用的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#代码;但是,当您试图访问这些成员时,将抛出运行时异常。