当构建系统已经引用System.Core时,添加对它的引用

问题描述 投票:31回答:4

即使项目构建,Visual Studio Intellisense也无法识别动态关键字。我试图添加对System.Core的引用来解决问题。我收到此错误:

无法添加对“System.Core”的引用。构建系统已自动引用此组件。

我注意到我的其他项目都引用了System.Core。我的修复是通过直接编辑csproj来添加它,这修复了Intellisense。是什么赋予了?为什么VS不允许我通过用户界面进行操作?

c# visual-studio visual-studio-2013
4个回答
37
投票

在做了一些研究后,我所能找到的只是之前的SO门票和一些博客,最终他们最终都使用了相同的工作方式。然后我发现了一个bug report,有人在2011年提交了Microsoft Connect,最终在一年后左右被MSFT员工Chuck England回答。

TL; DR - 由于multi-targeting功能添加到VS2008(能够更改项目的.NET Framework目标),团队做出了有意识的决定。

由于目标框架需要“System.Core”,并且删除它会阻止构建(据我理解Chuck的答案),他们决定强制引用它,即使你实际上没有在它的列表中看到它引用。

您可能会说,有一种“安全”黑客,当您尝试再次将其添加到引用时会产生不良副作用,并且您最终需要直接编辑项目文件。


Microsoft Connect于2018年退役,但这是他们收到的答案的组合:

是的,经验不是很好。由于System.Core是必需的,因此您永远不应将其删除。我们通过为您添加它来修复此问题,即使您删除了引用。 [A]您看到的消息表明,System.Core是隐式引用的。因此,除了从项目文件中物理删除一行之外,您已删除它的事实并未以任何方式更改构建。

在合理的情况下,您可能希望能够这样做,但这是一个非常前卫的角落案例。但是,我们应该盲目地忽略这样一个事实:当你添加它时会产生错误。以前的版本对我们施加了很多这样的问题,这些版本不了解多目标,并且根本没有得到清理。

[Y]您可以通过右键单击项目节点并选择卸载来手动将其添加回来。再次右键单击项目节点,然后选择“编辑”。在编辑器中,复制另一个参考行(例如,“System”的参考行)并将其粘贴到同一ItemGroup内的原始参考下面。将引用名称更改为“System.Core”。右键单击项目节点,然后选择“重新加载”。选择“是”以保存并重新加载问题。

VS2008没有正确处理多目标。它可以让你构建不合法的东西。使用VS2010,我们已经非常努力地确保如果它为目标框架构建,那么它将在目标框架上运行。我不能说我知道任何不合适的地方。

我们不能回到VS2008的方式,因为它不了解多目标。它也不理解真正的“配置文件”,如.NET 4.0框架的客户端配置文件。事实上,您所看到的问题是因为VS2008系统已升级为处理多目标,而且它是拒绝引用的新规则集。

在这种情况下,即使您删除了引用,我们也会构建。你可能会说,但它不应该建立。但是,它将在目标框架上运行,因此应该已经构建。事实上,我们为您添加了“必需的”参考,这在某种程度上是一种破碎的经验。

我们实际上并没有及早发现这一点,并且非常了解我们如何在发布之前修复它以获得修复。但是,您应该始终引用并因此永远不会删除“System.Core”的事实使得这不会修复,因为这不是99%的客户会做的事情。


11
投票

在@Arthur的回答基础上,我发现有两件事情可以解决它:

添加到.csproj文件,缺少的行:

<Reference Include="System.Core" />

然后,根据forums.asp.net的回答,在main web.config中添加System.Core程序集引用(不是Views下的那个):

  <system.web>
    <compilation debug="true" targetFramework="4.7.1">
      <assemblies>
        <add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.7.1" />
    <!-- ... ... -->
  </system.web>

然后:

1)确保web.config中编译属性的.NET框架版本与项目属性中指定的版本相同。

2)确保视图文件夹web.config中的MVC程序集版本与您在项目中使用的MVC程序集相同。

3)重新启动Visual Studio(2017年)。

希望这可以帮助。


5
投票

通过手动将这些行添加到.csproj文件中恢复:

<Reference Include="System" />
<Reference Include="System.Core" />

1
投票

你好,我知道这个帖子已经老了,但对于那些仍在寻找解决方案的人来说,希望这可以帮助你。因为我也面临同样的问题,因为我不小心删除了System.Core dll。 我做的是我从C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.6.1 \ System.Core.dll复制了这个DLL,我将这些lib粘贴到我的项目bin中。 稍后您可以看到项目中的dll会自动添加到参考中。在那之后,我重启我的vs,它的工作原理! Goodluck希望它可以解决你的问题

© www.soinside.com 2019 - 2024. All rights reserved.