【问题标题】:Target non specific version of an assembly以非特定版本的程序集为目标
【发布时间】:2011-03-18 04:16:14
【问题描述】:

我试图不针对特定版本的 dll,但我不太确定如何。 我已将程序集属性上的选项特定版本设置为 false,但是如果我尝试运行应用程序并且请求的程序集的版本是以前的版本,我会得到:

FileLoadException: Could not load file or assembly 

当引用的 dll 的版本与当前版本不完全匹配时,就会发生这种情况。 我相信问题在于如何引用这个程序集。

【问题讨论】:

  • 程序集是否具有强名称?
  • 是的,它的强命名(有解决方法吗?)
  • 强命名程序集的目的是您不能针对另一个版本进行更改。因此,使用新版本的程序集重新构建您的应用程序。如果您需要经常更改程序集,您应该考虑使用MEF
  • 或提供未签名版本:),感谢您的选择

标签: c# assemblies dependencies


【解决方案1】:

虽然下面 App.Config 的代码示例是正确的,但您可能希望通过在任一 assemblyBinding 树中添加以下 publisherPolicy apply="no" 来防止 GAC 策略覆盖您的愿望,这将导致所有程序集忽略 GAC 发布者策略,或者您可以将 publisherPolicy apply="no" /> 放在dependentAssembly 树中,这将仅通过该程序集的 publisherPolicy。

   { <configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <publisherPolicy apply="no" /> // This applies to the whole application - all references
         <dependentAssembly>
         <publisherPolicy apply="no" /> // This applies only to this assembly
            <assemblyIdentity name="AssemblyName"
                              publicKeyToken="32ab4ba45e0a69a1"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>}

欲了解更多信息,请参阅:MSDN reference

【讨论】:

    【解决方案2】:

    您可以同时拥有两个 dll,并且可以使用 bindingRedirect,如下链接所示

    dll versioning in dotnet

    <configuration>
       <runtime>
          <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
             <dependentAssembly>
                <assemblyIdentity name="AssemblyName"
                                  publicKeyToken="32ab4ba45e0a69a1"
                                  culture="neutral" />
                <bindingRedirect oldVersion="1.0.0.0"
                                 newVersion="2.0.0.0"/>
             </dependentAssembly>
          </assemblyBinding>
       </runtime>
    </configuration>
    

    【讨论】:

      【解决方案3】:

      一般来说,如果您尝试使用特定版本的程序集,以下内容并不真正适用,您应该只使用您需要的版本。

      但是,有时您可能会遇到这样的情况:

      AssemblyX - 参考 AssemblyZ 的 1.2.1 版
      AssemblyY - 参考 AssemblyZ 的 1.2.2 版

      但是您的项目需要 AssemblyX AssemblyY。

      那么你如何解决这个问题?您可以将 AssemblyZ 的 1.2.1 和 1.2.2 放入 GAC,或者,如果您确定没有任何兼容性问题,您可以使用程序集重新绑定。这是一个示例(这在您的 Web.configApp.config 文件中):

      <configuration>
         <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
               <dependentAssembly>
                  <assemblyIdentity name="myAssembly"
                                    publicKeyToken="32ab4ba45e0a69a1"
                                    culture="neutral" />
                  <bindingRedirect oldVersion="1.0.0.0"
                                   newVersion="2.0.0.0"/>
               </dependentAssembly>
            </assemblyBinding>
         </runtime>
      </configuration>
      

      这基本上是说,如果您的解决方案中的任何程序集引用 myAssembly 的 1.0.0.0,那么它们应该真正使用 2.0.0.0 版本。您应该在路径中包含 2.0.0.0 版本。

      当您总是希望他们使用特定版本的程序集时可以使用的一个技巧是指定版本范围,如下所示:

              <dependentAssembly>
                  <assemblyIdentity name="MyAssembly" publicKeyToken="B7567367622062C6" culture="neutral" />
                  <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="1.2.1.0" />
              </dependentAssembly>
      

      这将强制 MyAssembly 的 1.2.1.0 版本用于 0.0.0.0 和 3.0.0.0 之间的任何 MyAssembly 版本引用。

      【讨论】:

      • 这并没有专门解决我遇到的问题,但我认为它可能在某些情况下,所以我将其作为答案
      • 如何指定 AssemblyX 以引用 AssemblyZ 的版本?我可以将 AssemblyX.dll.config 添加到我的安装文件夹并为已编译的应用程序自定义引用吗?
      • @Mehrdad Mirreza - 配置文件需要与您的 exe 文件的名称相匹配,并带有 .config 后缀。因此,如果您的 exe 是 MyProgram.exe,那么配置文件将需要称为 MyProgram.exe.config。至于将程序集绑定添加到已编译的应用程序,您可以尝试这样做,但是,大多数情况下您将无法开始编译,因为它无法找到正确版本的程序集.因此,最好的方法可能是针对您希望定位的程序集版本重新编译。
      【解决方案4】:

      到目前为止,我发现解决此问题的唯一方法是:

      1) ILMerge dll 与我拥有的依赖项 2) 提供依赖项(在本例中为 dll) 3)不签署大会,虽然这会很困难,因为我需要“取消签署”层次结构

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多