2013-03-12 33 views
4

在Visual Studio 2012 C#控制檯應用程序中,我將「.NET Framework目標」從4.5降級到4.0。 Win 7 Pro與兩個框架安裝。爲什麼VS2012項目引用程序集無法自動定位4.0

我再引用一個程序集,通過警告抱怨如下:從引用的程序集

The primary reference "System.Threading.Tasks.Dataflow, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" could not be resolved because it has an indirect dependency on the framework assembly "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v4.0". To resolve this problem, either remove the reference "System.Threading.Tasks.Dataflow, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" or retarget your application to a framework version which contains "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".

如果我試圖在這一點上進行編譯,我錯誤,監守類型和命名空間不可用,就好像程序集根本沒有被引用。

「添加引用」 對話框沒有任何 System.Runtime選擇,但如果我手動博澤到 C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \ 和引用的系統。在那裏發現運行時組件,警告消失,我可以編譯。

問題:

  1. 就是這樣的System.Runtime版本迫使潛在問題的道路(部署)。

  2. 如果VS項目屬性是seto目標框架4.0(不涉及定位4.0 SystemRuntime/CLR),爲什麼不是refferenced選擇了這個,爲什麼手動添加引用到我的項目修復那個問題?

回答

5

即使庫System.RuntimeC:\Windows\Microsoft.NET\Framework\v4.0.30319\目錄裏面,它不是.NET 4.0框架的一部分。 .NET 4.5是4.0版本的就地更新,安裝在具有相同版本號的相同文件夾中。

這裏是一個證明,證明該庫不上戲.NET 4.0中存在安裝截圖:

Plain 4.0 install

您也可以通過瀏覽到C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework目錄,你會發現原來的組件驗證此爲所有安裝的框架版本。您會發現System.Runtime.dll作爲.NETCore\v4.5.NETPortable\v4.5子目錄的一部分。

您可以將庫添加到項目中的原因是,運行時沒有在4.0和4.5之間更改,因此Visual Studio不知道甚至不關心手動添加的庫是否由4.5安裝。在這種情況下,Visual Studio中的目標只是一個過濾器,可避免您無意中將4.5程序集添加到目標爲4.0的項目。

其他信息:

裏克施特拉爾對主題一個很好的博客文章有更詳細的分析:

http://www.west-wind.com/weblog/posts/2012/Mar/13/NET-45-is-an-inplace-replacement-for-NET-40

+0

我試圖理解這個的含義 - 它實際上是否表示無法準確定位.net運行時的4.0版本(如果在安裝了4.5的系統上構建的)?這是否真的意味着編寫代碼 - 例如 - Windows 2008服務器的唯一方法是降級(可能從Win 8升級)我的開發機器到Windows 7和VS2010? – glenatron 2013-12-23 15:43:01

2

就是這樣的System.Runtime版本強迫潛在問題

是的,這個理由噸不會工作。它可以在你的機器上運行,因爲你已經安裝了4.5。您的程序會在僅有4.0的客戶機上崩潰並燒錄。 永不從Framework目錄添加引用。他們還在附近,他們很難過,他們得到了too many programmers in trouble,但向後兼容是神聖的。

構建系統只能告訴您使用引用程序集時遇到問題。在「添加引用」對話框中顯示的那些文件,它們存儲在c:\ program files \ reference程序集中,與運行時程序集相同,其編號爲而不是。你知道這是有效的,你確實得到了警告。其中,有點笨拙的告訴你,你的程序將無法在4.0的機器上工作。不要忽視這個警告,你真的必須定位4.5才能使用該程序集。硬要求你無法避免。

爲什麼不refferenced DLL採摘了

因爲它拒絕建立一個不能運行的程序。功能,而不是一個錯誤。

+0

該程序在構建後不會知道它是否適用於netfx 4或4.5,因爲它們都是CLR4,而這是唯一已知的DLL。所以如果你在VS中選擇「v4.5」作爲目標框架並且「合法地」引用這個DLL,你仍然會遇到同樣的問題 - 必須檢查installer /入口點中是否存在4.5。 – hypersw 2014-07-17 15:04:27

+0

CLR知道,它檢查編譯器自動嵌入的程序集中的[TargetFramework]屬性。自動爲用戶提供一個對話框,讓他可以安裝適當版本的.NET。 – 2014-07-17 15:06:57

+0

你確定這不是'.exe.config'文件的效果,如果你的NetFX和Windows版本足夠新鮮,它實際上會觸發這種行爲? (因此在上面的評論中「檢查入口點」)。 根據我的經驗,如果一個DLL被加載到一些已經運行的CLR4應用程序中,則不會發生這樣的用戶對話。它會盡可能長時間運行,它會拋出缺少的程序集/類型/成員的異常,只是常規方式。 – hypersw 2014-07-17 16:24:27

相關問題