一个解决方案中的两个项目使用相同dll的两个不同版本

时间:2020-06-08 13:23:36

标签: c# dll siemens

我正在尝试实现以下先前问题的解决方案,并且我不想劫持该问题,因此我要发布一个新问题。我希望可以。 Same DLLs two different versions

我有一个类似以下的项目结构

  • 客户
    • 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文件,并将“复制本地”设置为 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>

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

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,版本= 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-function的instances-list中,我应该具有两个不同的整数集。

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

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

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

0 个答案:

没有答案