【问题标题】:C# project reference setting SpecificVersion = False seems not workingC# 项目参考设置 SpecificVersion = False 似乎不起作用
【发布时间】:2014-04-19 15:13:32
【问题描述】:

我有以下场景:

  • A.dll 版本 1.0.0.1
  • B.dll 版本 1.0.0.1 依赖于 A.dll。引用设置为 SpecificVersion = False

    <Reference Include="A">
        <HintPath>A.dll</HintPath>
        <SpecificVersion>False</SpecificVersion>
    </Reference>
    
  • C.exe 使用Assembly.LoadFrom("B.dll") B.dll 加载

如果我将 A.dll 的版本更改为 1.0.0.2,我会在 Assembly.LoadFrom("B.dll") 上收到 FileNotFoundException,说它找不到 A.dll 1.0.0.1(当时只有 A.dll 1.0.02 存在,但应该没关系,因为 SpecificVersion 是假的)

【问题讨论】:

  • 你只是误解了SpecificVersion的作用。它只在编译时起作用,从不在运行时起作用。 CLR 坚持在运行时进行精确 匹配,需要一个 .config 文件来说服它您没有犯错。您可能是,几乎没有充分的理由避免使用更新的 A 参考程序集来重建 B。
  • @HansPassant:签名不会改变。只是整个应用程序共享相同的内部版本号,所以唯一改变的是数字:S 我认为没有检查内部版本号,只有主要和次要值。我错了吗?
  • 你有充分的证据证明你确实错了。
  • @HansPassant:我明白了。我不明白为什么我在构建时不需要它,但我在运行时需要它。有什么有趣的参考资料可以指点我吗?
  • @HansPassant 能否提供链接,详细说明为什么 CLR 坚持完全匹配?

标签: .net dll reflection assemblyversions


【解决方案1】:

您可以按照 Hans 在评论中的建议使用程序集绑定重定向:

<dependentAssembly>
    <assemblyIdentity name="someAssembly"
      publicKeyToken="32ab4ba45e0a69a1"
      culture="en-us" />

    <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />
  </dependentAssembly>

请参阅此链接了解更多信息 http://msdn.microsoft.com/en-us/library/7wd6ex19(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2019-01-19
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多