1

We have an app where we switch between different versions of a 3rd party interop library (AutoCad). The subset of the interop API we use is the same across all versions of the interop library.

What would be the most effective way to reference different versions of the library while reusing the client code?

One approach is to use reflection: define a wrapper type for each of the used interop interfaces and use reflection inside the wrappers to load the interop type from the specified version of the interop assembly and just proxy every call to the interop object. This approach looks wasteful to me when all the interfaces in the used subset are exactly the same across all versions of the interop.

Other approach would be to reference different interop assemblies in different configurations of the project. With the identical interfaces across interop assemblies this should allow to compile different versions of the client assembly for each version of the interop assembly. One thing I'm not sure how to implement in this approach is configuring the project so that it builds all the versions of the client assembly at the same time to include them all in a single distribution.

It should be possible to employ code gen here as well, but I'm not sure how difficult it could be.

How would you solve this kind of problem?

Thanks!

4

3 回答 3

2

对于低于 AutoCAD 2013 的版本,您实际上可以只引用一个互操作程序集并提供相同的输出程序集。AutoCAD 互操作程序集不是强签名的,不需要特定版本。多年来有一些 API 发生了变化,可以通过反射或引用正确互操作程序集的“子”程序集来解决。

AutoCAD 2013 显着改变了互操作库。您可以为每个配置引用不同的程序集,这需要手动编辑项目文件,因为您无法通过 gui 执行此操作,或者设置两个不同的项目,它们可以在同一个解决方案中,引用不同的程序集。您可以将文件从一个项目链接到另一个项目,以免重复文件。

我已经使用了这两种技术,哪种方法效果更好取决于具体情况。

于 2012-06-06T16:48:07.533 回答
0

这取决于。如果您只调用 AutoCAD Interop 的少数接口,则使用反射或更高版本的绑定可能是一个不错的选择。这样,您就不必担心不同的 AutoCAD 版本、不同的 COM 引用等,因为您提到所有接口在您关注的所有 AutoCAD 版本中都是相同的。

如果有很多 COM 调用,您可能会发现反射或 COM 后期绑定非常繁琐且容易出错。这样,为不同的 AutoCAD 创建不同的构建似乎不是一个坏主意,尽管这些 COM 接口可能是相同的。就同​​时创建所有这些构建而言,可以将一些不同的项目配置生成到单个解决方案中,或者使用一些 MAKE 文件更好。

于 2012-06-18T23:28:26.167 回答
0

我会采用您的第一种方法的修改版本。定义您自己的界面,这样您就可以随时引用它。有一个单独的实现来加载从构造函数传入的库。构造函数通过反射实例化互操作程序集对象的实例,并将其保存在私有成员字段中。实现对象的方法使用反射调用对象的方法。

于 2012-06-06T16:50:35.403 回答