代码之家  ›  专栏  ›  技术社区  ›  Hemanshu Bhojak

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

  •  61
  • Hemanshu Bhojak  · 技术社区  · 15 年前

    我有以下情况

    项目A

     - Uses Castle Windsor v2.2
     - Uses Project B via WindsorContainer
    

    项目B

     - Uses NHibernate
     - Uses Castle Windsor v2.1
    

    在项目A的bin文件夹中,我有dll Castle.dynamicproxy.dll v2.2和NHibernate dll。现在的问题是NHibernate依赖于Castle.dynamicproxy.dll v2.1,而Castle.dynamicproxy.dll v2.1并不存在。我该如何解决这个问题。

    4 回复  |  直到 8 年前
        1
  •  96
  •   Hemanshu Bhojak    15 年前

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

    <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>
    
        2
  •  11
  •   Community Mohan Dere    10 年前

    一件非常非常重要的事情,如果他没有给予足够的注意,他可能会错过。

    必须是 名字很重。

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

    对于没有强名称的程序集,将忽略版本,并且 loader使用<代码库>里面 <从属程序集>。如果应用程序中有条目 将绑定重定向到另一个程序集的配置文件 即使程序集版本不存在,重定向也将优先 匹配绑定请求。

        3
  •  9
  •   Jørn Schou-Rode dscher    15 年前

    一种解决方案(或解决方法)是在 全局程序集缓存 (GAC)在需要运行软件的计算机上,并使用程序集的强名称引用程序集。这假设程序集确实具有强名称。

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

    ILMerge 合并程序集。需要运行的命令如下所示(未测试):

    ILMerge /t:library /internalize /out:Deploy/NHibernate.dll
        NHibernate.dll Castle.DynamicProxy2.dll
    

    这个 /internalize 开关告诉ILMerge标记来自第二个程序集的所有类型(在本例中为Castle) internal NHibernate.dll Castle.dynamicproxy.dll

    推荐文章