2010-07-21 116 views
35

当A针对.NET 3.5并且B针对.NET 2.0时,Visual Studio 2008确实允许您从程序集B引用程序集AVisual Studio 2010:参考程序集针对高框架版本

Visual Studio 2010不允许使用此功能。完整的问题上MSDN描述:

您可以创建应用程序, 参考项目或组件是 目标不同版本的.NET框架 的。例如,如果您创建的目标为.NET Framework的客户端配置文件的 应用程序,该012xx项目可以引用一个程序集,该程序集的目标是.NET Framework 2.0版。 但是,如果你创建 目标的较早版本的.NET框架 的,你不能在项目中的 基准设定为一个项目 或组装面向.NET框架 4客户端配置文件或项目。 NET Framework 4。为了消除错误, 确保 您的应用程序所针对的配置文件与 兼容 或您的 应用程序所引用的程序集所针对的配置文件。

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

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

确切的错误是:

警告MSB3268:主要参考 “xxx.dll” 无法得到解决,因为它有 对 框架组件的间接依赖“System.Core程序, 版本= 3.5.0.0,文化=中立, PublicKeyToken = b77a5c561934e089“其中 不能在当前的 目标框架中解决。 “.NETFramework,Version = v2.0”。为了 解决此问题,请删除 参考 “xxx.dll” 或重新定位你的应用程序包含 “System.Core程序一个 框架版本,版本= 3.5.0.0, 文化=中立, 公钥= b77a5c561934e089 ”。

+2

我有点不知所措,为什么你想这样做。那么整个应用程序会不会要求更高版本的框架才能启动?在这种情况下,将目标版本升级到更高版本没有意义吗? – cHao 2010-07-21 11:24:23

+2

这很难解释,但背后有一个合理的要求。 – 2010-07-21 11:39:59

+3

合理要求:由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)。 – 2011-10-17 14:36:42

回答

44

第一步:卸载引用项目针对.NET 2.0

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

第三步:编辑:添加<SpecificVersion>true</SpecificVersion>的参考。以下是我的代购解决方案示例:

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

第4步:重新加载项目。

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

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

+0

工作就像一个魅力!谢谢 :-)!! – Muhammedh 2013-01-08 08:15:51

+0

惊人的辉煌。这就是我称之为SO的有用答案。谢谢!! – Jawad 2016-05-23 18:26:48

+0

这也适用于我。我们有一些人使用不同版本的VS 2015或VS 2017.该入口是否会影响VS 15的用户? – Rod 2017-08-30 12:51:40

20

.NET Framework版本编号在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 blurb告诉你,当你的目标是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解决几个老的bug 2.0 couldn不容易修复,而不会冒险破坏依赖于错误行为的旧代码。

+1

我知道,这正是我想知道它不再工作的原因。我的项目没有一个是4.0项目,但有2.0个项目引用了3.5个项目(应该可以正常工作)。 – 2010-07-21 11:25:14

+0

我没有看到你在你的问题中提及任何类型的错误信息。如果没有这个信息,帮不了你。 – 2010-07-21 11:27:14

+0

@汉斯:感谢您的调查,我已经收录了相关的错误信息。 – 2010-07-21 11:39:01

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

在具有许多项目引用彼此大的解决方案,这可以具有级联效应,这是一种痛苦手动修复。为了使这个过程自动化,我编写了下面的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") 
1

请到到Visual Studio 2015年

  1. 首先,用鼠标右键单击继续你的项目
  2. 选择项目属性
  3. 选择应用程序选项卡(默认选项卡)
  4. 将目标框架更改为该特定项目所需的框架。 Image for this process is shown here
相关问题