2014-04-04 36 views
2

我有一些代码依赖于对COM应用程序的供应商产品的一部分的引用,使用.NET自动COM包装(我刚刚添加了一个使用Visual Studio的添加引用对话框的引用,并从注册COM组件列表)。我的代码面向.NET Framework 4.0。针对两个不同的程序集引用编译相同的代码?

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

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

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

+0

因此,您的目标是.NET 4.0,但是如果您的应用程序已安装在使用.NET 4.5的系统上,那么您希望使用新的供应商库? – Noseratio

+0

我正在编写与供应商产品交互的工具。我希望我的工具能够使用旧版本的产品(自动COM包装器参考)和较新版本(供应商提供的COM interop DLL),最好不需要维护两个代码库。如果我必须升级到使用.NET 4.5同时支持这两个版本,那我可以,但如果我可以同时定位到4.0上的旧COM包装和4.5上新的Interop.DLL,那更好。 – Hydrargyrum

回答

1

我如何建立我的Visual Studio项目,这样我可以有一个代码 基地与两个原始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已安装而不是

相关问题