在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程序集,警告消失,我能够编译。
问题:
System.Runtime版本的这种强制是一个潜在的问题(部署)。
如果VS Project属性被选择到目标框架4.0(与定位4.0 SystemRuntime / CLR没有关系),为什么引用的DLL没有选择它以及为什么手动添加对我的项目的引用修复了这个问题?
答案 0 :(得分:5)
即使库System.Runtime
在C:\Windows\Microsoft.NET\Framework\v4.0.30319\
目录中,它也不是.NET 4.0框架的一部分。 .NET 4.5是4.0的就地更新,安装在具有相同版本号的同一文件夹中。
这是一个屏幕截图,证明在.NET 4.0安装上不存在该库:
您还可以通过浏览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没有选择
因为它拒绝构建无法运行的程序。功能,而不是错误。