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

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

Visual Studio 2010不再允许这个。 完整的问题在MSDN上描述:

您可以创build引用项目或程序集的目标不同版本的.NET Framework的应用程序。 例如,如果您创build了一个以.NET Framework 4 Client Profile为目标的应用程序,则该项目可以引用以.NET Framework 2.0版为目标的程序集。 但是,如果创build一个面向早期版本的.NET Framework的项目, 则不能将该项目中的引用设置为以.NET Framework 4 Client Profile或.NET Framework 4为目标的项目或程序集 。 为了消除错误,请确保应用程序定位的configuration文件与您的应用程序引用的项目或程序集定位的configuration文件兼容。

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

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

确切的错误是:

警告MSB3268:主要引用“xxx.dll”无法parsing,因为它有框架程序集“System.Core,版本= 3.5.0.0,文化=中立,PublicKeyToken = b77a5c561934e089”间接依赖项无法parsing目前的目标框架。 ” .NETFramework,版本= V2.0" 。 要解决此问题,请删除引用“xxx.dll”或将应用程序redirect到包含“System.Core,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089”的框架版本。

第1步:卸载以.NET 2.0为目标的引用项目

第二步:右键单击卸载的项目,然后从上下文菜单中select编辑

第三步:将<SpecificVersion>true</SpecificVersion>到引用。 以下是我的repro解决scheme的示例:

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

第四步:重新加载项目。

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

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

.NET框架版本编号在2.0之后变得一团糟。 程序集不是以.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 blurb告诉你,当你的目标是CLR版本2.0,那么你不能使用目标4.0的程序集。 版本2.0 CLR不知道如何读取.NET 4.0程序集的元数据,格式已更改。 唯一的解决方法是强制 EXE加载CLR的4.0版本,即使它要求2.0.50727。 你用app.exe.config文件做到这一点,它应该看起来像这样:

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

微软用v4.0修正了2.0版本中的几个老bug,但是如果没有冒险破坏依赖于bug的行为的旧代码,那么很难修复。

 Add <SpecificVersion>true</SpecificVersion> to the reference 

在许多项目相互引用的大型解决scheme中,这可能具有层叠效应,这是手动修复的一个难题。 为了使这个过程自动化,我编写了下面的PowerShell脚本。 在解决scheme的顶层运行它 – 脚本以recursion方式search.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") 

请转到Visual Studio 2015

  1. 首先,继续右键单击您的项目
  2. select项目属性
  3. select应用程序选项卡(默认选项卡)
  4. 将目标框架更改为该特定项目所需的框架。 这个过程的图像显示在这里