我正在尝试实施以下较早问题的解决方案,并且我不想劫持该问题,因此我发布了一个新问题。我希望这没问题。 相同的 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。重建解决方案后,效果很好!感谢
我已经编辑了上面的配置代码以反映正确的解决方案。