Тип "System.Object" определен в сборке, на которую не ссылаются

Я установил пакет nuget для веб-интерфейса Microsoft ASP.NET Web API для моего проекта и добавил строку в метод WebApiconfig внутри метода Register, как показано в этой ссылке https://www.nuget.org/packages/Microsoft.AspNet.WebApi.MessageHandlers.Compression/

 GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new CompressionHandler(new GZipCompressor(), new DeflateCompressor()));

Также добавлен следующий код в файл web.config

<compilation debug="true" targetFramework="4.5">
      <assemblies>
        <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
      </assemblies>
</compilation>

Но я получаю сообщение об ошибке

Ошибка 1 Тип "System.Object" определен в сборке, которая не является ссылки. Вы должны добавить ссылку на сборку 'System.Runtime, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a. D:....\App_Start\WebApiConfig.cs

Компилятор жалуется на класс GlobalConfiguration с ошибкой выше. Я использую > NET Framework 4.5

Ответ 1

Я получил ту же ошибку и обошел ее, выполнив две вещи.

История:

Я создаю простое приложение ASP.Net для проверки работы с Google API OAuth2.0. Я использовал "nuget" для установки библиотеки Google.Apis.Calendar.v3 (v1.13.1.509), и это привело к множеству других DLL, от которых это зависит.

Ошибка:

При компиляции, казалось бы, простого ASP.Net-проекта, ориентированного на "Framework 4.5" на Visual Studio 2015 для Web (Express). Ошибка показала себя двумя способами:

Я изначально скомпилировал код, используя команду Build Ctrl+F5. Затем я получил ошибку сборки, но без записи на вкладке "Ошибка", которая обычно указывала бы на строку исходного кода. (Проект просто прекратил строительство). Вывод:

------ Build started: Project: oauth2.pylogen.com, Configuration: Debug Any CPU ------
Validating Web Site
Building directory '/App_Code/'.

E:\Projects\oauth2.pylogen.com\App_Code\Google.Api.Pylogen\FlowMetadata.cs(26,13): error 
CS0012: The type 'System.Object' is defined in an assembly that is not referenced. You 
must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b03f5f7f11d50a3a'.
Validation Complete
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========

Затем я приступил к установке dotNet Framework 4.6.1 Developer Pack (новейшая версия, которая не является предварительным просмотром).

Затем я перезапустил VS 2015 для Интернета и снова получил сборку. На этот раз я получил запись на вкладке "Ошибка", которая указывала на строку-источник:

flowInit.Scopes = new string[] { Google.Apis.Calendar.v3.CalendarService.Scope.Calendar };

Когда я прокомментировал эту строку, проект будет создан. Я почти ничего не мог сделать в этой строке, но я просто хотел показать неясность ошибки!

Решение:

После установки Framework 4.6.1 Developer Pack. Я также добавил эту строку в Web.Config:

<compilation debug="true" targetFramework="4.5">
  <assemblies>
    <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
  </assemblies>
</compilation>

После этого мой проект полностью строится. Мое предположение было бы в том, что Google ссылается на более раннюю версию System.Runtime.dll(хотя их детали пакета Nuget показывают, что целевая структура - 4.5).

Ответ 2

Это было немного сложно, потому что я также попробовал сначала добавить ссылку на сборку в файл корневого файла Web.config, что в моем случае не помогло. После этого я сделал то же самое для файла Web.config, который находится в папке Views для моего проекта ASP.NET MVC: Views\Web.config

  <system.web>
     <compilation>
        <assemblies>
          <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
        </assemblies>
     </compilation>
  </system.web>

Вышеописанное.

На самом деле у меня уже была одна ссылка для сборки System.Web.Mvc там раньше, поэтому heres полный список для моего проекта ASP.NET MVC.

  <system.web>
    <compilation>
      <assemblies>
        <add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
      </assemblies>
    </compilation>
  </system.web>

Ответ 3

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

Вы можете найти файлы, о которых идет речь, в следующей папке (в зависимости от целевой среды .NET), примеры:

.NET 4.5.1 – {ProgramFilesFolder x86 folder} \Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Facades
.NET 4.5 – {ProgramFilesFolder x86 folder} \Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades

Извлечен из http://www.lyalin.com/2014/04/25/the-type-system-object-is-defined-in-an-assembly-that-is-not-reference-mvc-pcl-issue/

Ответ 4

Я исправил эту проблему, обновив компилятор С# до Roslyn. Вы можете сделать это, перейдя в Project - Enable latest C# and VB features for ASP.NET Project.

Ответ 5

Установка и удаление System.ValueTuple через Nuget оставил файл System.ValueTyple.dll в моей папке bin. Удаление его решило проблему для меня.