2010-07-21 84 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
相關問題