从 C# 中引用不同的 ActiveX 版本作为一个
Referencing different ActiveX versions from C# as one
我在尝试以下内容时非常挣扎。
我目前正在使用 ActiveX,通过 Visual Studio(更准确地说是 tlbimp,隐式)生成的互操作 dll。
存在此 ActiveX 的不同版本,有时会在界面中添加、删除属性。如果我想改变版本,我必须改变参考,重新编译等等。
我想要我的代码的单一版本。我记得以驱动Word为例,可以通过Word.Application上的CreateInstance实例化一个word对象,然后调用方法,不管是什么版本。调用仅在运行时链接。我想对我使用的 activeX 做同样的事情,但我真的不知道该怎么做(顺便说一句,它是 sage objets100c dll)。我没有在 ActiveX 列表中找到它,因此我什至不确定我是否可以像 Word.Application.
有人知道我该怎么做吗? (可能是一个完全不同的解决方案,因为我的需要是:拥有一个代码而无需重新编译)。
提前致谢
如果您有相应的*.tlb 文件,请参考此文件,而不是dll。在引用的属性window中,可以将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
对象的 IntelliSense。如果您指定不存在的成员(方法或 属性 名称),您仍然可以编译和 运行 您的 C# 代码;但是,当您尝试访问这些成员时,将抛出 运行 次异常。
我在尝试以下内容时非常挣扎。
我目前正在使用 ActiveX,通过 Visual Studio(更准确地说是 tlbimp,隐式)生成的互操作 dll。
存在此 ActiveX 的不同版本,有时会在界面中添加、删除属性。如果我想改变版本,我必须改变参考,重新编译等等。
我想要我的代码的单一版本。我记得以驱动Word为例,可以通过Word.Application上的CreateInstance实例化一个word对象,然后调用方法,不管是什么版本。调用仅在运行时链接。我想对我使用的 activeX 做同样的事情,但我真的不知道该怎么做(顺便说一句,它是 sage objets100c dll)。我没有在 ActiveX 列表中找到它,因此我什至不确定我是否可以像 Word.Application.
有人知道我该怎么做吗? (可能是一个完全不同的解决方案,因为我的需要是:拥有一个代码而无需重新编译)。
提前致谢
如果您有相应的*.tlb 文件,请参考此文件,而不是dll。在引用的属性window中,可以将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
对象的 IntelliSense。如果您指定不存在的成员(方法或 属性 名称),您仍然可以编译和 运行 您的 C# 代码;但是,当您尝试访问这些成员时,将抛出 运行 次异常。