【问题标题】:Visual Studio 2010: Reference Assemblies Targeting Higher Framework VersionVisual Studio 2010:针对更高框架版本的参考程序集
【发布时间】:2010-07-21 11:12:38
【问题描述】:

当 A 面向 .NET 3.5 而 B 面向 .NET 2.0 时,Visual Studio 2008 允许您从程序集 B 引用程序集 A

Visual Studio 2010 不再允许这样做。完整的问题描述在MSDN

您可以创建应用程序 引用项目或程序集 针对不同版本的 .NET 框架。例如,如果您创建 面向 .NET 的应用程序 框架 4 客户端配置文件,即 项目可以引用一个程序集 针对 .NET Framework 2.0 版。 但是,如果您创建一个项目 针对早期版本的 .NET 框架,您不能设置 在该项目中对项目的引用 或以 .NET 为目标的程序集 Framework 4 客户端配置文件或 .NET 框架 4。为了消除错误, 确保配置文件的目标 您的应用程序兼容 项目所针对的个人资料 或您引用的程序集 应用。

有什么方法可以让 VS2010 在这方面表现得像 VS2008(即允许引用针对更高框架版本的程序集)?

我知道 VS 2010 行为背后的原因以及我需要注意的部署注意事项,无需重复。

确切的错误是:

警告 MSB3268:主要参考 “xxx.dll” 无法解决,因为它有 间接依赖于 框架组件“System.Core, 版本=3.5.0.0,文化=中性, PublicKeyToken=b77a5c561934e089" 其中 目前无法解决 有针对性的框架。 “.NETFramework,版本=v2.0”。到 解决这个问题,要么删除 参考资料 “xxx.dll” 或将您的应用程序重新定位到 包含的框架版本 “System.Core,版本=3.5.0.0, 文化=中性, PublicKeyToken=b77a5c561934e089"。

【问题讨论】:

  • 我有点不明白你为什么要这么做。整个应用程序是否不需要更高版本的框架才能启动?在这种情况下,定位更高版本是否有意义?
  • 这很难解释,但背后有一个合理的要求。
  • 合理要求:由 2.0 ASP.NET 站点和 3.5 WinForms 应用程序共享的业务逻辑程序集 ("BL")。网站使用较旧的 Enterprise Library 3.1,而 WinForms 应用程序使用较新的 EntLib 5.0。在为 WinForms 构建时,BL 需要将引用切换到较新的 EntLib,即 3.5,但 BL 仍需要为 2.0 项目才能与现有的 2.0 网站一起使用。 VS2008 通过切换配置允许这种情况发生,但 VS2010 抛出上述错误,因为 EntLib 5.0 需要 3.5 引用(特别是 System.Core)。

标签: visual-studio-2010 reference assemblies


【解决方案1】:

Step1:卸载面向 .NET 2.0 的引用项目

Step2: 右键单击​​卸载的项目并从上下文菜单中选择编辑

第 3 步:将 <SpecificVersion>true</SpecificVersion> 添加到引用中。以下是我的重现解决方案的示例:

<ProjectReference Include="..\HighFX\HighFX.csproj">
  <Project>{8DD71CAF-BEF7-40ED-9DD0-25033CD8009D}</Project>
  <Name>HighFX</Name>
  <SpecificVersion>true</SpecificVersion>
</ProjectReference>

Step4:重新加载项目。

现在您应该可以在 Visual Studio 2010 中构建了,可能仍然会出现如下警告,但构建可以成功。

来源:http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/dfadfb34-5328-4c53-8274-931c6ae00836

【讨论】:

  • 工作就像一个魅力!谢谢:-)!!
  • 太棒了。这就是我所说的关于 SO 的有用答案。谢谢!!
  • 这对我也有用。我们有些人使用不同版本的 VS 2015 或 VS 2017。该条目会影响 VS 15 的用户吗?
【解决方案2】:

.NET 框架版本编号在 2.0 之后变得一团糟。程序集以 .NET 框架版本为目标,它以 CLR 版本为目标。框架版本 2.0、3.0 和 3.5 的 CLR 版本相同,均为 2.0.50727。

这就是为什么它看起来你可以在 VS2008 中混合版本。但是您看到的是程序集的 [AssemblyVersion],它与 CLR 版本无关。不幸的是,CLR 版本在“属性”窗口中不可见,您必须运行 Ildasm.exe 才能在元数据中看到它。但是您可以放心地假设 2.0.0.0 和 3.5.0.0 之间的任何程序集版本都针对 CLR 版本 2.0.50727

以 .NET 4.0 结束,它有一个新的 CLR 版本,4.0.30319。 MSDN 简介告诉您,当您以 CLR 版本 2.0 为目标时,您不能使用以 4.0 为目标的程序集。 2.0 版 CLR 不知道如何读取 .NET 4.0 程序集的元数据,格式已更改。唯一的解决方法是强制 EXE 加载4.0 版本的CLR,即使它要求2.0.50727。您使用 app.exe.config 文件执行此操作,它应该如下所示:

<configuration>
  <startup>
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

经过一些测试,它仍然可以正常工作,Microsoft 使用 v4.0 修复了 2.0 中的几个旧错误,如果不冒险破坏依赖错误行为的旧代码,这些错误是无法轻易修复的。

【讨论】:

  • 我知道,这正是我想知道它不再起作用的原因。我的项目都不是 4.0 项目,但有 2.0 项目引用 3.5 项目(应该可以正常工作)。
  • 我没有看到您在问题中提到任何类型的错误消息。如果没有该消息,将无法为您提供帮助。
  • @Hans:感谢调查,我已将相关错误信息包含在内。
  • 这是一个正确的警告信息。 System.Core.dll 在 .NET 2.0 上不可用。您需要定位到 3.5。功能,而不是错误。
  • @Hans:很抱歉再次汇总,但这种情况在 2008 年确实有效。我和你一样清楚 CLR 和 Framework 版本之间的区别,但是因为 .net 3.5 和 2.0 目标CLR 2 从 2.0 项目中引用 3.5 程序集在 2008 年是可能的,但在 2010 年不再适用。
【解决方案3】:
Add <SpecificVersion>true</SpecificVersion> to the reference

在一个包含许多相互引用的项目的大型解决方案中,这可能会产生级联效应,手动修复会很痛苦。为了自动化这个过程,我编写了下面的 PowerShell 脚本。在解决方案的顶层运行它 - 脚本递归搜索 .csproj 文件并更新与 部分 GUID 匹配的 ProjectReference 元素(您必须通过编辑脚本的相关行来指定).

dir -recurse -filter *.csproj | foreach { 
    $xml = New-Object XML

    $xml.Load($_.FullName)

    # we want the ItemGroup that contains the references
    $itemgroup = $xml.Project.ItemGroup | where { $_.ProjectReference }
    # Project GUIDs to search for... (edit as needed for your projects)
    $projrefs = $itemgroup.ProjectReference `
        | where { !$_.SpecificVersion `
            -and ( $_.Project -like "*CF2185B1*" `
                -or $_.Project -like "*CF2185B2*" `
                -or $_.Project -like "*CF2185B3*") `
        }

    if ($projrefs) {
        Write-Host $_.FullName

        foreach($ref in $projrefs) {
            if($ref) {
                # <specificversion>true</specificversion>
                $el = $xml.CreateElement("SpecificVersion", $xml.Project.xmlns) 
                $el.InnerText = "true"
                $ref.AppendChild($el) | out-null
                Write-Host "    updated: " $ref.Name
            }
        }

        $xml.Save($_.FullName) 
    }
}

Write-Host "Press any key to continue ..."
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

【讨论】:

    【解决方案4】:

    请转到 Visual Studio 2015

    1. 首先,右键单击您的项目
    2. 选择项目属性
    3. 选择应用程序选项卡(默认选项卡)
    4. 将目标框架更改为所需的框架 具体项目。Image for this process is shown here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-27
      • 2010-12-15
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      相关资源
      最近更新 更多