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

Joh*_*lph 35 assemblies reference visual-studio-2010

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

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

您可以创建引用面向不同.NET Framework版本的项目或程序集的应用程序.例如,如果创建面向.NET Framework 4 Client Profile的应用程序,则该项目可以引用面向.NET Framework 2.0版的程序集.但是,如果创建的项目面向早期版本的.NET Framework,则无法将该项目中的引用设置为面向.NET Framework 4 Client Profile或.NET Framework 4的项目或程序集.要消除错误,请确保应用程序所针对的配置文件与应用程序引用的项目或程序集所针对的配置文件兼容.

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

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

确切的错误是:

警告MSB3268:无法解析主要引用"xxx.dll",因为它对框架程序集"System.Core,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089"具有间接依赖性,无法在目前有针对性的框架." .NETFramework,版本= V2.0" .要解决此问题,请删除引用"xxx.dll"或将应用程序重新定位到包含"System.Core,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089"的框架版本.

Joh*_*lph 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>
Run Code Online (Sandbox Code Playgroud)

第4步:重新加载项目.

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

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


Han*_*ant 21

在2.0之后,.NET框架版本编号变得一团糟.一种组件,它不是针对一个.NET Framework版本,它的目标是一个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>
Run Code Online (Sandbox Code Playgroud)

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


Jus*_*yes 6

Add <SpecificVersion>true</SpecificVersion> to the reference
Run Code Online (Sandbox Code Playgroud)

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

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")
Run Code Online (Sandbox Code Playgroud)