Visual Studio 2010:针对更高框架版本的参考程序集

时间:2010-07-21 11:12:38

标签: visual-studio-2010 reference assemblies

当A针对.NET 3.5且B针对.NET 2.0时,Visual Studio 2008确实允许您从程序集A引用程序集B

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

中有所描述
  

您可以创建应用程序   参考项目或组件   针对不同版本的.NET   框架。例如,如果您创建   一个面向.NET的应用程序   框架4客户端配置文件,即   项目可以引用一个程序集   目标.NET Framework 2.0版。   但是,如果您创建一个项目   针对早期版本的.NET   框架,你不能设置一个   在该项目中引用项目   或针对.NET的程序集   框架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,   文化=中性,   公钥= b77a5c561934e089" 。

4 个答案:

答案 0 :(得分:44)

步骤1:卸载面向.NET 2.0的引用项目

步骤2:右键单击已卸载的项目,然后从上下文菜单中选择编辑

第3步:将<SpecificVersion>true</SpecificVersion>添加到参考中。以下是我的repro解决方案的示例:

<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

答案 1 :(得分:21)

.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>

并且进行了一些测试,它仍然可以正常工作,微软使用v4.0来修复2.0中的几个旧错误,这些错误无法轻易修复而不会冒险破坏依赖于错误行为的旧代码。

答案 2 :(得分:6)

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")

答案 3 :(得分:1)

请转到Visual Studio 2015

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