Erstellungsfehler: Sie müssen einen Verweis auf System.Runtime hinzufügen

209

Ich bereite eine brandneue ASP.NET MVC 5.1-Lösung vor. Ich füge eine Reihe von NuGet-Paketen hinzu und richte sie mit der Zurb Foundation usw. ein.

Als Teil davon habe ich einen Verweis auf ein internes NuGet-Paket hinzugefügt, das eine Portable Class Library ist, und ich denke, dies verursacht ein Problem auf dem Build-Server.

TeamCity schlägt den Build fehl mit:

Der Typ 'System.Object' wird in einer Assembly definiert, auf die nicht verwiesen wird. Sie müssen einen Verweis auf Assembly 'System.Runtime, Version = 4.0.0.0 hinzufügen

Ich habe ursprünglich den Fix für den gleichen oder einen ähnlichen Fehler beim Kompilieren der Razor-Webseiten hinzugefügt. Dieser Fix befindet sich in der web.config

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

Das Problem ist jedoch ungelöst.

Luke Puplett
quelle

Antworten:

216

Um das Update zu implementieren, erweitern Sie zunächst den vorhandenen Kompilierungsabschnitt von web.config, der standardmäßig so aussieht:

<compilation debug="true" targetFramework="4.5"/>

Nach der Erweiterung habe ich das folgende neue Konfigurations-XML hinzugefügt, wie ich angewiesen wurde:

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

Die endgültigen web.config-Tags sollten folgendermaßen aussehen:

<compilation debug="true" targetFramework="4.5">
  <assemblies>     
    <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />   
  </assemblies>
</compilation>
Baahubali
quelle
2
Dieses Problem hat sich in ein MVC-Projekt mit 4.52 eingeschlichen, keine bekannte PCL, aber viele nuGet-Pakete. Ich glaube, dass die Deinstallation von VS2013 dies ausgelöst hat, aber ich weiß das nicht als Tatsache. Der Fehler trat nur in Ansichten auf, die auf X-PagedList verweisen. Durch Hinzufügen eines Verweises auf das Projekt web.config (nicht Ansichten web.config) wurde das Problem behoben.
Greg Terrell
1
@ GregTerrell Ich hatte gerade genau dieses Problem nach dem Upgrade von einer alten Version von X.PagedList. So frustrierend. Das Hinzufügen der Referenz hat funktioniert, dann wurde der .vsOrdner nach dem Schließen des Projekts gelöscht (umbenannt) , erneut geöffnet, der web.configEintrag entfernt und jetzt wird er ordnungsgemäß erstellt und ausgeführt.
Mardoxx
@Mardoxx Ich hatte das gleiche Problem. Liegt das Problem mit VS oder X.PagedList? Wenn es sich um einen VS-Fehler handelt, kann ich web.config patchen, möchte aber keine .config-Dateien ändern, wenn das Problem bei X.PagedList liegt.
Jecoms
@Jecoms Ich habe auf Ihr Github-Problem geantwortet :) github.com/kpi-ua/X.PagedList/issues/49#issuecomment-243515362
Mardoxx
3
Ich habe diesen Fehler nach der Installation von MoreLINQ in meinem .Net 4.5.1-Projekt erhalten. Diese Antwort hat es gelöst.
Chris Moschini
125

Durch Hinzufügen eines Verweises auf diese System.Runtime.dll-Assembly wurde das Problem behoben:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Facades\System.Runtime.dll

Obwohl diese Datei in diesem expliziten Pfad nicht auf dem Build-Server vorhanden ist.

Ich werde mit weiteren Informationen zurückschicken, sobald ich eine Dokumentation zu PCL und diesen Fassaden gefunden habe.

Aktualisieren

Ja, so ziemlich nichts über Fassadenbaugruppen im gesamten Internet.

Google:

(Facades OR Facade) Portable Library site:microsoft.com
Luke Puplett
quelle
2
Wenn Sie die DLL-Dateien im angegebenen Ordner nicht finden können, können Sie das Windows SDK wie folgt
user3918598
Vielen Dank. Der obige Link funktionierte nach der Installation von 4.5.1 SDK.
Matt Beckman
40
Es gibt jetzt einen KB-Artikel zum Microsoft-Support , der sich damit befasst.
Peter Majeed
1
@PeterMajeed Du solltest diesen Kommentar wirklich als Antwort hier posten. Vielen Dank für den Tipp!
Julealgon
3
Ich musste 'Copy local' auf true setzen, damit es funktioniert
Phate01
28

Der einzige Weg, der für mich funktioniert hat. Fügen Sie die Assembly zu web.config hinzu

<compilation debug="true" targetFramework="4.5">
  <assemblies>     
    <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />   
  </assemblies>
</compilation>
Lorena Pita
quelle
1
Danke Lorena! Arbeitete für mich
Annia Martinez
Arbeiten einzeilig, hängt nicht vom Pfad zur Bibliothek ab und erfordert keine Installation, sollte akzeptiert werden!)
Ivan Zverev
Diese Antwort ist die gleiche wie die am besten gewählte Antwort von @Baahubali
Jesper Mygind
27

@ PeterMajeeds Kommentar in der akzeptierten Antwort half mir bei einem verwandten Problem. Ich verwende die tragbare Bibliothek nicht, habe jedoch den gleichen Erstellungsfehler bei einer Neuinstallation von Windows Server 2012, bei der ich TeamCity ausführe.

Die Installation von Microsoft .NET Framework 4.5.1 Developer Pack hat das Problem behoben (nachdem die MS Build Tools separat installiert wurden ).

sfuqua
quelle
5
Irgendwelche Ideen, was mit 4.6 zu tun ist? Ich sehe kein Entwicklerpaket.
Georgiosd
4
Ich habe sowohl 4.5.1 als auch 4.5.2 Dev Packs und bekomme immer noch diesen Fehler. Ideen? Ich möchte nicht in allen meinen 25 Projekten darauf verweisen. Aus bestimmten Gründen benötigen andere 25 dies nicht.
Abatishchev
Gute Fragen - Ich habe mich noch nicht mit 4.5.2 oder 4.6 befasst, zumindest vom Standpunkt der Build-Automatisierung.
Sfuqua
Ich denke, wenn Sie wirklich nicht weiterkommen, können Sie die kostenlose Visual Studio Community Service Edition jederzeit aktivieren und auf dem neuesten Stand halten.
Luke Puplett
Ich verstehe nicht, warum diese Entwicklerpakete installiert werden müssen. Ich habe VS2013 Pro installiert. Ist das nicht genug Aber es hat das Problem hier gelöst. Vielen Dank.
Mike de Klerk
10

Ich hatte dieses Problem in einigen Lösungen auf VS 2015 (allerdings nicht in MVC) und sogar in derselben Lösung auf einer Workstation, aber nicht auf einer anderen. Die gestarteten Fehler traten auf, nachdem die .NET-Version auf 4.6 geändert und auf PCL verwiesen wurde.

Die Lösung ist einfach: Schließen Sie die Lösung und löschen Sie den versteckten .vs-Ordner im selben Ordner wie die Lösung.

Das Hinzufügen der fehlenden Referenzen, wie in anderen Antworten vorgeschlagen, löst das Problem ebenfalls, aber der Fehler bleibt auch nach dem erneuten Entfernen der Referenzen behoben.

Was TeamCity betrifft, kann ich nicht sagen, da meine Konfiguration nie ein Problem hatte. Stellen Sie jedoch sicher, dass Sie den Arbeitskatalog als Teil Ihrer Debugging-Bemühungen zurücksetzen.

wezzix
quelle
6

Es ist ein altes Problem, aber ich habe es heute konfrontiert, um eine Build-Pipeline auf unserem Continuous Integration Server zu reparieren. Hinzufügen

<Reference Include="System.Runtime" />

zu meiner .csprojDatei löste das Problem für mich.

Ein bisschen Kontext: Das interessierte Projekt ist ein vollständiges .NET Framework 4.6.1-Projekt ohne Build-Probleme auf den Entwicklungsmaschinen. Das Problem tritt nur auf dem Build-Server auf, den wir nicht kontrollieren können. Dies kann an einer anderen SDK-Version oder ähnlichem liegen.

Durch Hinzufügen des Vorschlags wurde <Referenceder Erstellungsfehler zum Preis einer fehlenden Referenzwarnung (gelbes Dreieck am hinzugefügten Eintrag im Referenzbaum) in Visual Studio behoben .

Ich hoffe, dies kann Menschen in ähnlichen Szenarien helfen ...

Pietro Martinelli
quelle
In einem ähnlichen Kontext auch für mich gelöst
Nicola Celiento
3

Installieren Sie die .NET Runtime sowie das Targeting Pack für die .NET-Version, auf die Sie abzielen.

Das Entwicklerpaket besteht nur aus diesen beiden Dingen, die derzeit gebündelt sind. Derzeit scheint es jedoch keine Version 4.6 zu geben, sodass Sie die beiden Elemente separat installieren müssen.

Downloads finden Sie hier: http://blogs.msdn.com/b/dotnet/p/dotnet_sdks.aspx#

Oenotria
quelle
3

Ich hatte auch dieses Problem beim Versuch, ein ASP .NET MVC-Projekt nach einem geringfügigen Update unserer Codebasis auszuführen, obwohl es fehlerfrei kompiliert wurde:

Compiler-Fehlermeldung: CS0012: Der Typ 'System.Object' ist in einer Assembly definiert, auf die nicht verwiesen wird. Sie müssen einen Verweis auf die Assembly 'System.Runtime, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' hinzufügen.

Unser Projekt war noch nie auf dieses Problem gestoßen, daher war ich skeptisch, Konfigurationsdateien zu ändern, bevor ich die Grundursache herausfand. In den Fehlerprotokollen konnte ich diese detaillierte Compilerausgabe finden, die darauf hinwies, was wirklich geschah:

Warnung CS1685: Der vordefinierte Typ 'System.Runtime.CompilerServices.ExtensionAttribute' wird in mehreren Assemblys im globalen Alias ​​definiert. Verwenden der Definition aus 'c: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ mscorlib.dll'

c: \ Benutzer \ Admin \ Softwareentwicklung \ Quellcodeverwaltung \ Binärdateien \ Veröffentlichen \ WebApp \ Ansichten \ Konto \ Index.cshtml (35,20): Fehler CS0012: Der Typ 'System.Object' ist in einer Assembly definiert nicht referenziert. Sie müssen einen Verweis auf die Assembly 'System.Runtime, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' hinzufügen.

c: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporäre ASP.NET-Dateien \ meseems.webapp \ 68e2ea0f \ 8c5ee951 \ Assembly \ dl3 \ 52ad4dac \ 84698469_3bb3d401 \ System.Collections.Immutable.DLL: (Speicherort des Symbols zum vorherigen Fehler)

Anscheinend hat ein neues Paket, das unserem Projekt hinzugefügt wurde, auf eine ältere Version von .NET Framework verwiesen, was das Problem "Definition in mehreren Assemblys" (CS1685) verursachte, das zur Laufzeit zum Compilerfehler der Rasiermesseransicht führte.

Ich habe das inkompatible Paket (System.Collections.Immutable.dll) entfernt und das Problem trat nicht mehr auf. Wenn das Paket in Ihrem Projekt jedoch nicht entfernt werden kann, müssen Sie die Antwort von Baahubali versuchen .

Thomas CG de Vilhena
quelle
2

Auf unserem Tfs 2013 Build Server hatte ich den gleichen Fehler in einem Testprojekt. mit dem Hauptwebprojekt, das auf .Net 4.5.1 ausgeführt wird.

Ich habe ein nuGet-Paket von System Runtime installiert und den Verweis aus packages \ System.Runtime.4.3.0 \ ref \ net462 \ System.Runtime.dll hinzugefügt

Das hat es für mich gelöst.

Bob Lokerse
quelle
Das sollte wahrscheinlich nicht funktionieren, da Sie ihm sagen, dass er die .NET 4.6.2-DLL mit einem .NET 4.5.1-Projekt verwenden soll
Chris Marisic
1
..und doch hat es funktioniert, auch für mich. Keine Wahl, da der Ordner ... \ 45 \ ... nur eine Stub-Datei mit dem Namen _._
nathanchere
2

Ich habe System.Runtime.dll zu bin project hinzugefügt und es hat funktioniert :)

Abdullah Tahan
quelle
1

Ich hatte dieses Problem in einer Lösung mit einem Web-API-Projekt und mehreren Bibliotheksprojekten. Eines der Bibliotheksprojekte war auf Build ausgelegt, mit Fehlern, die besagten, dass die Unity-Attribute keine "gültigen" Attribute waren, und einem Fehler, der besagte, dass ich auf System.Runtime verweisen musste.

Nachdem ich viel gesucht, das 4.5.2 Developer Pack neu installiert und nichts funktioniert hatte, stellte ich fest, dass es sich möglicherweise nur um eine Versionsinkongruenz handelte. Also habe ich mir die Eigenschaften jedes Projekts angesehen, und eine der Basisbibliotheken zielte auf 4.5 ab, während jede andere auf 4.5.2 abzielte. Ich habe dieses geändert, um auch 4.5.2 zu erreichen, und die Fehler sind verschwunden.

Sliderhouserules
quelle
1

Ich kopiere die Datei "C: \ Programme (x86) \ Referenzassemblies \ Microsoft \ Framework.NETFramework \ v4.5.1 \ Facades \ system.runtime.dll" in den Ordner bin des Produktionsservers. Dadurch wird das Problem behoben.

Tomluke
quelle
Eine andere Möglichkeit besteht darin, einen Verweis auf diese Assembly im Projekt hinzuzufügen und Copy Local = True zu setzen.
John Mc
0

Installieren Sie https://www.microsoft.com/en-us/download/details.aspx?id=49978 Microsoft .NET Framework 4.6.1 Developer Pack und fügen Sie diese Codezeile in die Datei Web.config ein

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

Das Entfernen des Verweises über den Nuget Package Manager und das erneute Hinzufügen löste das Problem für mich.

Stefan
quelle