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



当我试图理解下面的内容时,我很挣扎。

我目前正在使用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#代码;但是,当您试图访问这些成员时,将抛出运行时异常。

最新更新