我有一些代码依赖于对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)?
答案 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已安装 。