Добавьте ссылку на System.Core, когда она уже ссылается на систему сборки

Visual Studio Intellisense не распознает динамическое ключевое слово, даже если проект строится. Я попытался добавить ссылку на System.Core чтобы решить эту проблему. Я получаю эту ошибку:

Ссылка на "System.Core" не может быть добавлена. Этот компонент уже автоматически ссылается на систему сборки.

Я заметил, что другие мои проекты ссылаются на System.Core. Мое исправление заключалось в том, чтобы добавить его, отредактировав непосредственно csproj, который исправил Intellisense. Что дает? Почему VS не позволяет мне делать это через пользовательский интерфейс?

Ответ 1

Проведя некоторые исследования, я смог найти только предыдущие билеты SO и несколько блогов, и в конечном итоге все они использовали тот же обходной путь, что и вы. Затем я нашел сообщение об ошибке, которое кто-то подал в Microsoft Connect в 2011 году (теперь доступно только на Wayback Machine или в более удобочитаемом формате на моем блоге), на которое в итоге был дан ответ примерно через год Чак Инглэнд, сотрудник MSFT.

TL; DR. Это было сознательное решение, принятое командой благодаря функции мульти-таргетинга, добавленной в VS2008 (возможность изменить цель проекта .NET Framework).

Поскольку целевая структура требует "System.Core", и удаление ее предотвратит сборку (насколько я понимаю, ответ чака), они решили навязать ссылку на нее, даже если вы на самом деле не видите ее в списке ссылки.

Вы можете сказать, что это "безопасный" взлом с нежелательным побочным эффектом, который выдает эту ошибку, когда вы снова пытаетесь добавить его в ссылки, и вам в конечном итоге нужно редактировать файл проекта напрямую.


Microsoft Connect был удален в 2018 году, но здесь соответствующие части оригинальной темы:

Да, опыт не велик. Поскольку требуется System.Core, вы никогда не должны его удалять. Мы исправили это, добавив его для вас, даже если вы удалите ссылку. [A] s сообщение, которое вы видели, указывает на System.Core неявно ссылается. Таким образом, тот факт, что вы удалили его, кроме физического удаления строки из файла проекта, никак не изменил сборку.

Существуют законные сценарии, когда вы можете захотеть сделать это, но это очень острый случай. Тем не менее, мы должны слепо игнорировать тот факт, что при добавлении его обратно генерируется ошибка. Многое из этого было навязано нам предыдущими версиями, которые не понимали многоцелевой таргетинг и просто не были очищены.

[Y] вы можете вручную добавить его обратно, щелкнув правой кнопкой мыши на узле проекта и выбрав Unload. Снова щелкните правой кнопкой мыши узел проекта и выберите "Изменить". В редакторе скопируйте другую ссылочную строку (например, для "Система") и вставьте ее ниже исходной ссылки в той же ItemGroup. Измените имя ссылки на "System.Core". Щелкните правой кнопкой мыши узел проекта и выберите "Перезагрузить". Выберите "да" для вопроса, чтобы сохранить и перезагрузить.

VS2008 неправильно обрабатывал мульти-таргетинг. Это позволило бы вам создавать вещи, которые не были законными. В VS2010 мы очень старались убедиться, что, если он собирается для целевой платформы, он будет работать на целевой среде. Не могу сказать, что знаю места, где это не так.

Мы не можем вернуться к пути VS2008, так как он не понимает многоцелевой таргетинг. Он также не понимал настоящих "профилей", таких как клиентский профиль .NET 4.0 framework. На самом деле проблема, с которой вы сталкиваетесь, заключается в том, что система VS2008 была модернизирована для работы с многоцелевым таргетингом, а новый набор правил отклоняет ссылку.

В этом случае мы создаем, даже если вы удалили ссылку. Вы могли бы сказать, но это не должно было быть построено. Но он будет работать на целевой структуре и, следовательно, должен был быть построен. Тот факт, что мы добавили для вас "обязательную" ссылку, является отчасти неудачным опытом ее разработки.

Мы на самом деле просто не поняли это достаточно рано, и с действительно твердым пониманием того, как мы могли бы это исправить, чтобы получить исправление до нашего релиза. Но тот факт, что вы всегда должны ссылаться и, следовательно, никогда не удалять "System.Core", сделал это не исправлением, поскольку 99% клиентов никогда не будут делать это.

Ответ 2

Основываясь на ответе @Arthur, я обнаружил, что две вещи разрешили это для меня:

Добавьте в файл .csproj недостающую строку:

<Reference Include="System.Core" />

Затем, в соответствии с ответом на forums.asp.net, добавьте ссылку на сборку System.Core в main web.config (а не в разделе 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) Убедитесь, что версия среды.NET для свойства компиляции в web.config аналогична версии, указанной в свойствах проекта.

2) Убедитесь, что версия сборки MVC в папке views web.config такая же, как сборка MVC, которую вы используете в своем проекте.

3) Перезапустите Visual Studio (2017 здесь).

Надеюсь это поможет.

Ответ 3

Восстановление вручную путем добавления этих строк в файл.csproj:

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

Ответ 4


привет, я знаю, что этот пост уже старый, но для тех, кто все еще ищет решение, надеюсь, что это поможет вам. Поскольку Im также сталкивается с той же проблемой, поскольку я случайно удалил dll System.Core.

И я сделал то, что я скопировал эту dll из C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.6.1\System.Core.dll, и я вложил эти библиотеки в мой проект.

Позже вы увидите, что внутри вашего проекта dll добавляется автоматически в ссылку. После этого я перезапускаю свой vs, и он работает! Надеюсь, он сможет решить вашу проблему