0

我正在尝试实施以下较早问题的解决方案,并且我不想劫持该问题,因此我发布了一个新问题。我希望这没问题。 相同的 DLL 两个不同的版本

我有一个如下的项目结构

  • 客户
    • Form1.cs
  • TiaOpennessV15_1
    • TiaOpenness.cs
    • V151
      • Siemens.Engineering.dll (15.1.0.0)
  • TiaOpennessV16
    • TiaOpenness.cs
    • V16
      • Siemens.Engineering.dll (16.0.0.0)

这两个 TiaOpenness 项目都使用名为 Siemens.Engineering 的 dll 文件,尽管它们分别使用版本 15.1.0.0 和 16.0.0.0。我已将这些 dll 文件分别放在文件夹 V151 和 V16 下的单独项目中。我在每个 TiaOpenness 项目中引用了不同的 dll 文件,并将 "Copy Local" 设置为False

在我的客户端项目(Windows 窗体)中,我有以下 App.config 代码。

App.config [已解决]

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Siemens.Engineering" publicKeyToken="d29ec89bac048f84" culture="neutral"/>
      <bindingRedirect oldVersion="0.0.0.0-15.1.0.0" newVersion="15.1.0.0"/>
      <bindingRedirect oldVersion="15.1.0.1-16.0.0.0" newVersion="16.0.0.0"/>
      <codeBase version="15.1.0.0" href="V151\Siemens.Engineering.dll"/>
      <codeBase version="16.0.0.0" href="V16\Siemens.Engineering.dll"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

当我启动客户端时,我可以通过运行下面的代码来验证客户端在这两种情况下都使用 16.0.0.0 版本的 dll。

private void FindInstancesButton_Click(object sender, EventArgs e)
{
  List<int> instances = new List<int>();

  using (Base core = new Base(new TiaOpennessV15_1.TiaOpenness()))
  {
    instances.AddRange(core.ListInstanceIds());
  }

  using (Base core = new Base(new TiaOpennessV16.TiaOpenness()))
  {
    instances.AddRange(core.ListInstanceIds());
  }
}

如果我从上面删除 App.config 代码,我会收到以下错误。

System.IO.FileNotFoundException:'无法加载文件或程序集'Siemens.Engineering,Version=16.0.0.0,Culture=neutral,PublicKeyToken=d29ec89bac048f84'或其依赖项之一。该系统找不到指定的文件。'

请注意,同一个对话框有一个内部异常,指出版本 15.1.0.0 而不是版本 16.0.0.0,但具有相同的 PublicKeyToken。

我检查了两个 dll 文件是否分别移动到 bin/debug 文件夹中的文件夹 V151 和 V16 中。我不知道还能做什么......非常感谢任何帮助!

编辑 1 @KlausGütter:我希望能够使用我的客户端访问两个 TiaOpenness 项目(类库),每个项目都应该使用自己的 dll 版本。不同的版本返回不同的实例 ID,我应该在上面的 FindInstancesButton_Click 函数的实例列表中有一组两个不同的整数。

现在发生的事情是两个 TiaOpenness 项目都使用相同的 dll,即使我正在尝试使用不同的 dll。

编辑 2 @KlausGütter:谢谢克劳斯!事实证明,编译后自动将 bindingRedirect 插入到配置文件中。我没有看到你之前链接的帖子,但果然我必须将我自己的 bindingRedirects 插入到配置文件中并将其设置为 false。重建解决方案后,效果很好!感谢

我已经编辑了上面的配置代码以反映正确的解决方案。

4

0 回答 0