2013-03-12 37 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

相关问题