【问题标题】:Using an identical interface in different versions of a 3rd party interop library在 3rd 方互操作库的不同版本中使用相同的接口
【发布时间】:2012-06-06 16:19:22
【问题描述】:

我们有一个应用程序,可以在其中切换不同版本的 3rd 方互操作库 (AutoCad)。我们使用的互操作 API 子集在互操作库的所有版本中都是相同的。

在重用客户端代码的同时引用不同版本的库最有效的方法是什么?

一种方法是使用反射:为每个使用的互操作接口定义一个包装器类型,并在包装​​器内使用反射从指定版本的互操作程序集加载互操作类型,并仅代理对互操作对象的每次调用。当使用的子集中的所有接口在所有互操作版本中完全相同时,这种方法对我来说看起来很浪费。

其他方法是在项目的不同配置中引用不同的互操作程序集。使用跨互操作程序集的相同接口,这应该允许为互操作程序集的每个版本编译不同版本的客户端程序集。我不确定如何在这种方法中实现的一件事是配置项目,以便它同时构建客户端程序集的所有版本,以将它们全部包含在单个分发中。

这里应该也可以使用代码生成器,但我不确定它有多难。

你会如何解决这类问题?

谢谢!

【问题讨论】:

  • 使用后期绑定。只有在 C# 中使用 dynamic 关键字才能轻松实现。

标签: c# .net interop dry autocad


【解决方案1】:

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

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

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

【讨论】:

  • 嗯,我们正在使用 Autodesk.AutoCAD.Interop 和 Autodesk.AutoCAD.Interop.Common,它们具有很强的名称,驻留在 GAC 中(autocad 安装程序将它们放在那里)并且对于不同的版本具有不同的版本号AutoCAD 的版本。这些有非强命名版本吗?
  • 啊,您正在使用 COM 互操作库。我怀疑你已经通过添加引用对话框的 COM 选项卡选择了这些。他们的 ObjectARX sdk 包括我不认为是强签名的 COM 库。您是否尝试过使用纯 .net 程序集,或者您是否正在做需要 COM 东西的事情?
  • 我不确定我们是否需要任何 COM 的东西,它是一个遗留项目,所以我不认为在这一点上切换互操作是一种选择。如果我们找不到一种方法来制作单个项目来为不同版本的互操作生成多个程序集,我认为我们会选择不同项目引用相同源文件的选项(应该可以使用自定义 MS 构建脚本)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 2021-10-20
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多