为了支持 Darin 的回答,您当然需要消除此类多版本问题。他使用绑定重定向的解决方案是一个很好的解决方案 - +1。我可以提供一个解决方案,让您在绝对必要时保留两者,但您必须编写一些代码。
这里唯一真正的问题是两个部署的文件名必须相同才能被加载程序默认拾取。你可以非常可怕地作弊,只需将 5.8 dll 部署为Conflict.exe,这样它就可以并排放置Conflict.dll(和更新版本),你会发现它可以工作。
此外,通过达林回答中的链接,您来到this topic MSDN topic on probing。根据这个内容,你可以简单地将5.8的dll部署到bin\Content\Content.dll中,当运行时搜索它时,它会自动在这个子文件夹中查找。
但是 - 这不是一个好的解决方案 :)
编辑 - 新解决方案
如果 Conflict.dll 的两个版本都已签名,您是否尝试过部署其中一个名称稍有不同的版本?我刚刚设置了一个 winforms 应用程序,其中包含对同一(签名)程序集的不同版本的两个程序集引用。这会导致构建出现一些问题,因为最后引用的版本将部署到 bin 文件夹,而另一个不会(因此您必须手动复制两者;相应地重命名其中一个)。然后我尝试运行应用程序,它会显示一个包含两个常量字符串的消息框;来自程序集的每个版本。它工作得很好。
Download a demo of this here - 不要构建它(否则你必须重命名文件);只需打开表单应用程序的 bin\debug 文件夹并运行 exe。
ClassLibrary1.dll 和 ClassLibary1vanything.dll 是具有相同名称和公钥的程序集的 v1.0.0.0 和 v2.0.0.0。尽管 classlibrary1vanything.dll 的文件名错误,但它仍然有效(可能是因为它已签名)。
在 app.config 中,我确实输入了代码库提示,并认为这就是它起作用的原因(最初我将它部署为不同的文件名),但后来我将其注释掉,它仍然有效。当程序集必须部署到子文件夹或完全不同的位置时,代码库可能最有用。
原文
我试图让提到的第二个选项in this support article from MS 起作用,但它似乎不想这样做。
毫无疑问,有一些聪明的方法可以开箱即用,但由于我还不够聪明,无法找到它(还),我会改为修饰并使用上述支持中显示的第三个选项主题并挂钩到应用域的AssemblyResolve 事件。
如果您添加自己的配置(实际上可能只是在 appSettings 中)将程序集的全名绑定到不同的文件名,那么在您的 AssemblyResolve 事件处理程序中,您可以查询要加载的程序集的名称看看它是否在您的配置中。如果是,请抓住该位置并使用 Assembly.LoadFrom 加载它。
因此,一旦您有了类似的东西,您只需在其中添加 Conflict v5.8 程序集名称的条目以及应用程序应使用的文件名。
我不知道您正在部署什么类型的应用程序,但在 win 表单中,控制台应用程序和服务 AppDomain.CurrentDomain.BaseDirectory 将等于 bin 文件夹,您可以使用您想要加载的文件名加入它.网站有点棘手。
应该是一种享受。