我们有一个应用程序,我们在不同版本的第三方互操作库(AutoCad)之间切换。我们使用的互操作API的子集在互操作库的所有版本中都是相同的。
在重用客户端代码时,引用不同版本库的最有效方法是什么?
一种方法是使用反射:为每个使用的互操作接口定义包装类型,并在包装器内使用反射从指定版本的互操作程序集加载互操作类型,并只代理对互操作对象的每次调用。当所使用的子集中的所有接口在所有版本的互操作中完全相同时,这种方法对我来说是浪费的。
其他方法是在项目的不同配置中引用不同的互操作程序集。通过互操作程序集的相同接口,这应允许为每个版本的互操作程序集编译不同版本的客户端程序集。我不确定如何在这种方法中实现的一件事是配置项目,以便它同时构建客户端程序集的所有版本,以将它们全部包含在一个分发中。
也应该可以在这里使用代码gen,但我不确定它有多难。
你会如何解决这类问题?
谢谢!
答案 0 :(得分:2)
对于低于AutoCAD 2013的版本,您实际上只能参考一个互操作程序集并运送相同的输出程序集。 AutoCAD互操作程序集不是强签名的,不需要特定版本。多年来有一些API发生了变化,可以通过反射或引用正确互操作程序集的“子”程序集来解决。
AutoCAD 2013显着改变了互操作库。您可以为每个配置引用不同的程序集,这些程序集需要手动编辑项目文件,因为您无法通过gui执行此操作,或者设置两个不同的项目,这些项目可以位于引用不同程序集的同一解决方案中。您可以将文件从一个项目链接到另一个项目,这样就不会重复文件。
我已经使用了这两种技术,哪种效果更好取决于具体情况。
答案 1 :(得分:0)
我会选择第一种方法的修改版本。定义您自己的界面,以便您始终可以参考。有一个实现加载从构造函数传入的库。构造函数通过反射实例化interop程序集对象的实例,并将其保存在私有成员字段中。实现对象的方法使用反射调用对象的方法。
答案 2 :(得分:0)
这取决于。如果只调用AutoCAD Interop的少数接口,则使用反射或以后的绑定可能是一个不错的选择。通过这种方式,您无需担心不同的AutoCAD版本,不同的COM引用等,因为您提到的所有接口在您关注的所有AutoCAD版本中都是相同的。
如果有很多COM调用,您可能会发现反射或COM以后的绑定非常繁琐且容易出错。通过这种方式,为不同的AutoCAD创建不同的构建似乎并不是一个坏主意,尽管这些COM接口可能是相同的。在同时创建所有这些构建方面,可以在单个解决方案中生成一些不同的项目配置,或者更好地使用一些MAKE文件。