我正在尝试实现以下先前问题的解决方案,并且我不想劫持该问题,因此我要发布一个新问题。我希望可以。 Same DLLs two different versions
我有一个类似以下的项目结构
两个TiaOpenness项目都使用名为Siemens.Engineering的dll文件,尽管它们分别使用15.1.0.0和16.0.0.0版本。我将这些dll文件分别放在文件夹V151和V16下的单独项目中。我已经在每个TiaOpenness项目中引用了不同的dll文件,并将“复制本地”设置为 False 。
在我的客户端项目(Windows窗体)中,我具有以下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。重建解决方案后,效果很好!谢谢
我已经编辑了上面的配置代码以反映正确的解决方案。