4

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

问题:

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

  2. 如果 VS 项目属性设置为针对 Framework 4.0(这与针对 4.0 SystemRuntime/CLR 无关),为什么引用的 DLL 没有选择它,为什么手动添加对我的项目的引用可以解决这个问题?

4

2 回答 2

5

即使该库System.Runtime位于C:\Windows\Microsoft.NET\Framework\v4.0.30319\目录中,它也不是 .NET 4.0 框架的一部分。.NET 4.5 是 4.0 的就地更新,安装在具有相同版本号的同一文件夹中。

这是一个屏幕截图,证明该库在 play .NET 4.0 安装中不存在:

普通 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

于 2013-03-13T18:57:23.557 回答
2

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

是的,这行不通。它可以在您的机器上运行,因为您安装了 4.5。您的程序将在只有 4.0.0 的客户端计算机上崩溃并烧毁。 永远不要从 Framework 目录添加引用。令人遗憾的是,他们仍然存在,他们让太多的程序员陷入困境,但向后兼容是神圣的。

构建系统只能告诉您在使用参考程序集时遇到了问题。Add Reference 对话框中显示的那些,它们存储在 c:\program files\reference 程序集中,运行时程序集不同。你知道这行得通,你确实得到了警告。其中,以一种有点笨拙的方式告诉您,您的程序将无法在具有 4.0.0 的机器上运行。不要忽略该警告,您确实必须以 4.5 为目标才能使用该程序集。你无法避免的硬性要求。

为什么引用的 DLL 没有选择它

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

于 2013-03-13T20:15:29.363 回答