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

标签 c# .net-assembly com-interop

我有一些代码依赖于对作为 COM 应用程序的供应商产品的一部分的引用,使用 .NET 自动 COM 包装(我刚刚使用 Visual Studio 的“添加引用”对话框添加了一个引用,并从中选择已注册的 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)?

最佳答案

How can I set up my Visual Studio project so that I can have one code base which works with both the original VendorApplication COM component (preferably on .NET 4.0 if that's feasible) and the new VendorApplication.Interop.dll (on .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 已安装。

关于c# - 针对两个不同的程序集引用编译相同的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22851971/

相关文章:

c# - 为什么 C# -> CIL 在每条指令上都有一个标签?

ajax - Microsoft.Ajax.Utilities dll : Missing Assembly, 从哪里下载?

c# - 从 Javascript 在 PageMethod 中接收动态对象

c# - 如何将具有索引引用的 JSON 数据反序列化为强类型 C# 对象?

f# - 使用 Codedom 在运行时编译 F# 源代码?

windows - 有没有办法减少与进程外 COM 调用相关的开销?

c# - VB6 变体类型到 .NET 类型

c# - 通过 C# 访问远程 COM 对象

c# - 如何在不使用其控件的情况下仅从报告服务获取数据?

c# - ssis包执行直接成功,通过c#代码执行失败