当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" 。
答案 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