针对两个不同的程序集引用编译相同的代码?

时间:2014-04-04 01:34:22

标签: c# .net-assembly com-interop

我有一些代码依赖于对COM应用程序的供应商产品的一部分的引用,使用.NET自动COM包装(我只是使用Visual Studio的Add Reference对话框添加了一个引用,并从中选择已注册的COM组件列表)。我的代码面向.NET Framework 4.0。

最新版本的供应商产品已经弃用了COM GUI应用程序,但现在附带了一个COM互操作DLL,它实现了与原始COM应用程序相同的API。但是,新的COM互操作DLL是使用.NET Framework 4.5编译的。

由于API相同,我不想维护两个单独的代码库,以便与供应商产品的旧版本和新版本兼容。

如何设置我的Visual Studio项目,以便我可以拥有一个代码库,该代码库可以与原始VendorApplication COM组件一起使用(如果可行,最好在.NET 4.0上)和新的VendorApplication.Interop.dll(在。 NET 4.5)?

1 个答案:

答案 0 :(得分:1)

  

如何设置Visual Studio项目以便我可以拥有一个代码   base与原始VendorApplication COM一起使用   组件(最好在.NET 4.0上,如果可行的话)和新组件   VendorApplication.Interop.dll(在.NET 4.5上)?

这样做的一种方法是创建相同的两个版本" thunk"库,暴露相同的API。每个版本都应该有自己的strong name

  • 第一个版本(例如,MyInterfaceAssembly.dll版本为v4.0.0.1)应以.NET 4.0为目标并使用旧的供应商库。

  • 第二个版本(MyInterfaceAssembly.dll v4.5.0.1)应以.NET 4.5为目标,并使用新的供应商库。

  • 您的应用程序构建为引用并链接到第一个版本(v4.0.x)。

  • 安装程序将安装v4.0.x或v4.5.x,具体取决于最终用户系统。

  • 最重要的部分是app.config文件,您可以使用<bindingRedirect>

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="MyCompany.MyInterfaceAssembly" publicKeyToken="xxxxxxxxxxxxxxxx" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.5.0.1" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

在.NET 4.5上,您的应用程序将使用MyInterfaceAssembly.dll v4.5.x运行,前提是v4.0.x已安装