在同一文件夹中使用同一程序集的不同版本

Hem*_*jak 63 assemblies reference multiple-versions

我有以下情况

项目A.

 - Uses Castle Windsor v2.2
 - Uses Project B via WindsorContainer
Run Code Online (Sandbox Code Playgroud)

项目B.

 - Uses NHibernate
 - Uses Castle Windsor v2.1
Run Code Online (Sandbox Code Playgroud)

在Project AI的bin文件夹中有dll Castle.DynamicProxy2.dll v2.2和NHibernate dll.现在问题是NHibernate依赖于Castle.DynamicProxy2.dll v2.1而不存在.我该如何解决这种情况.

Hem*_*jak 91

我使用以下配置来解决此问题.

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Castle.DynamicProxy2" publicKeyToken="407dd0808d44fbdc" />
                <codeBase version="2.1.0.0" href="v2.1\Castle.DynamicProxy2.dll" />
                <codeBase version="2.2.0.0" href="v2.2\Castle.DynamicProxy2.dll" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" />
                <codeBase version="1.1.0.0" href="v2.1\Castle.Core.dll" />
                <codeBase version="1.2.0.0" href="v2.2\Castle.Core.dll" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

  • dll放在哪里?在网站的根目录中名为v2.1和v2.2的文件夹中?你能把子目录中的dll放到bin文件夹中吗? (10认同)
  • 对于网站,href应当以“ bin \”开头,例如&lt;codeBase version =“ 1.0.0.0” href =“ bin \ folder \ namedll.dll” /&gt; (3认同)
  • 为了澄清 @MoslemBenDhaou 的建议,如果“Project B”在“v2.2”中正常运行,“bindingRedirect”会很有帮助;只需要告诉它使用“v2.2”而不是构建它的版本(“v2.1”)。如果由于某种原因“项目 B”必须使用 *完全* `v2.1`,则使用此处答案中显示的双 codeBase 方法。注意[这个答案](/sf/answers/1324503841/) - 要使两个代码库正常工作,程序集必须是*强命名*。 (3认同)

Lau*_*nho 10

如果他没有给予足够的重视,那么可能会错过一件非常非常非常重要的事情.

您在codeBase版本标记中编写的程序集必须是强名称.

从以下链接:http://msdn.microsoft.com/en-us/library/efs781xb.aspx

对于没有强名称的程序集,将忽略版本,并且加载程序使用<dependentAssembly>内的<codebase>的第一个外观.如果应用程序配置文件中有一个条目将绑定重定向到另一个程序集,则即使程序集版本与绑定请求不匹配,重定向也将优先.


Jør*_*ode 9

一种解决方案(或解决方法)是在您的软件需要运行的机器上的全局程序集缓存(GAC)中安装这两个版本,并使用其强名称引用程序集.这假设程序集确实具有强名称.

如果您有多个开发人员,或者您计划将解决方案部署到许多计算机(例如,作为最终用户应用程序),那么安装到GAC将是一件痛苦的事.在这种情况下,我相信(但我可能错了)你唯一的选择是将两个版本中的一个合并到需要该版本的程序集中.在您的特定情况下,您需要Castle.DynamicProxy2.dll合并到v2.1 NHibernate.dll.

您可以使用名为ILMerge的工具合并程序集.您需要运行的命令看起来像这样(未经测试):

ILMerge /t:library /internalize /out:Deploy/NHibernate.dll
    NHibernate.dll Castle.DynamicProxy2.dll
Run Code Online (Sandbox Code Playgroud)

/internalize开关告诉ILMerge internal在输出程序集中标记来自第二个程序集(在本例中为Castle)的所有类型.如果没有这个,当您尝试编译引用v2.2的新NHibernate.dll版本和Castle.DynamicProxy2.dll架构版本的项目时,可能会遇到编译错误,因为它们将包含具有完全相同名称的类.


归档时间:

查看次数:

41994 次

最近记录:

8 年,1 月 前