为什么带参考汇编的VS2012项目无法自动定位4.0

时间:2013-03-12 14:21:16

标签: reference visual-studio-2012 target-framework

在Visual Studio 2012 C#控制台应用程序中,我将“.NET Framework Target”从4.5降级到4.0。安装了两个框架的Win 7 Pro。

然后我引用一个程序集,通过警告抱怨以下内容:

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 \ 并引用那里找到的System.Runtime程序集,警告消失,我能够编译。

问题:

  1. System.Runtime版本的这种强制是一个潜在的问题(部署)。

  2. 如果VS Project属性被选择到目标框架4.0(与定位4.0 SystemRuntime / CLR没有关系),为什么引用的DLL没有选择它以及为什么手动添加对我的项目的引用修复了这个问题?

2 个答案:

答案 0 :(得分: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为目标的项目中。

其他信息:

Rick Strahl在这个主题上有一篇非常好的博客文章,有更详细的分析:

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

答案 1 :(得分:2)

  

System.Runtime版本的这种强制是一个潜在的问题

是的,这是行不通的。它适用于您的机器,因为您已安装4.5。您的程序将在仅具有4.0的客户端计算机上崩溃并刻录。 从不从Framework目录添加引用。他们仍在身边,感到非常难过,他们得到了too many programmers in trouble,但是向后的比赛是神圣的。

构建系统只能告诉您使用引用程序集时遇到问题。 “添加引用”对话框中显示的内容存储在c:\ program files \ reference程序集中,与运行时程序集相同。你知道这很有效,你确实得到了警告。其中,有点笨拙地告诉你,你的程序将无法在4.0的机器上运行。不要忽略该警告,你真的必须以4.5为目标来使用该程序集。你无法避免的硬性要求。

  

为什么引用的DLL没有选择

因为它拒绝构建无法运行的程序。功能,而不是错误。