Ermitteln Sie die Quelle einer indirekten Abhängigkeit von einer fehlerhaften .NET Framework-Version

8

Ich würde gerne wissen, wie ich die Quelle dieses Build-Fehlers ermitteln kann;

%Vor%

Ich verstehe die Bedeutung dieses Fehlers (und die 5 anderen mögen es für dasselbe Projekt), aber ich kann nicht herausfinden, wie ich es in meinem Fall lösen kann. Die 'primäre Referenz' in diesem Fall (MyNamespace.MyProject) hat keine direkten Abhängigkeiten zu .NET 4.0.x.

Die primäre Referenz hängt nur von einem anderen Projekt ab (MyNamespace.MyCoreProject), von dem auch das Quellprojekt für den Build (MyNamespace.MyOtherProject) direkt abhängt. Und der Build beschwert sich nicht über das -Projekt mit indirekten Verweisen auf .NET 4.0.x, also nehme ich an, dass ich das ausschließen kann.

Die primäre Referenz hat eine direkte Abhängigkeit von drei (3) Drittanbieter-DLLs, die alle auch Target .NET 2.0 enthalten.

Ich habe dotPeek verwendet, um die gebauten Bibliotheken zu untersuchen, und kann unter .NET 4.0 keinen Verweis auf irgendetwas finden.

Der einzige andere mögliche Schlüssel in den Arbeiten ist die Verwendung von PostSharp, auf das direkt von 'MyNamespace.MyCoreProject' verwiesen wird (das vom primären Referenzprojekt referenziert wird), was das Problem verursachen könnte, da ich glaube, dass es einen Zusammenhang gibt VS2010 Bug bei der Referenzierung von PostSharp.dll (http://www.sharpcrafters.com/forum/Topic4444-4-1.aspx#bm4462), aber ich habe auch das aus der Build-Kette entfernt und sehe immer noch diesen Fehler, also nehme ich an kann auch das herausregeln.

Wenn mir jemand sagen kann, warum das passiert, fantastisch! Wenn nicht, wäre eine Richtung, wie man herausfinden kann, was der unnamierte "indirekte Bezug" ist, genauso hilfreich!

Übrigens habe ich alle folgenden Tools ausprobiert, um einige Informationen zu erhalten, aber sie sagen mir nicht viel, was ich nicht schon wusste (was die direkten Abhängigkeiten der betreffenden DLL sind);  - .NET Reflektor  - dotPeek  - IldAsm  - Hängt davon ab (Dependency Walker)

    
RJ Lohan 06.06.2012, 00:02
quelle

6 Antworten

5

Ich habe zwar nicht wirklich einen guten Weg gefunden, das Problem zu lösen, wie MsBuild die Referenzen bestimmt, die es benutzt (warum es mir nicht nur sagt, wie es mit diesen indirekten Referenzen auskommt, anstatt mich zu raten) weiß nicht ...) Ich habe mein Problem gelöst.

Am Ende habe ich im Prinzip alle Verweise im Projekt 'Primärreferenz' entfernt (die den gesamten Code Stück für Stück ausschließen mussten - ein etwas schmerzhafter Prozess), um die Quelle des vermeintlichen indirekten Verweises auf .NET 4.0-Bibliotheken zu bestimmen wurde von einer DLL eines Drittanbieters verursacht, auf die verwiesen wurde.

Ich glaube jedoch, dass hinter diesem Problem ein Bug in MsBuild steckt, wie;

  1. Die DLL von Drittanbietern wurde durch "Durchsuchen" auf eine bestimmte DLL-Datei auf meinem Computer verwiesen - eine, die SEHR EXKLUSIV nur von .NET 2.0
  2. abhängt
  3. Wenn 'Spezifische Version' im Build auf 'wahr' gesetzt wurde, konnte dies nicht behoben werden
  4. MsBuild scheint für eine andere Version dieser DLL zum GAC zu gehen und den falschen Referenzfehler zu verursachen.

Nun, eine andere Kuriosität ist, dass ich die relevanten Bibliotheken nicht irgendwann berührt oder geändert habe, also hat dies gerade angefangen, aus einem anderen, nicht miteinander verbundenen Grund zu geschehen - was das sein könnte, weiß ich nicht.

Am Ende konnte ich dieses Problem nur lösen, indem ich gacutil / u für jede der relevanten Bibliotheken ausführen ließ, um zuvor installierte / verwendete Versionen der 4.0-Bibliotheken zu entfernen. (Es waren ungefähr 40 im Paket, also war das auch schmerzhaft! Da das Deinstallationsprogramm des Pakets die Bibliotheken im GAC nicht löschte)

Dies scheint zu haben, dass msbuild damit begonnen hat, die Referenzen zu verwenden, die ich ihm gesagt habe, anstatt eine eigene Vorstellung davon zu bekommen, was "diese Datei verwenden" und "diese spezifische Version verwenden bedeutet.

Gelöst, aber ich hätte einen saubereren Weg dafür genossen!

    
RJ Lohan 07.06.2012, 00:26
quelle
2

Versuchen Sie, MSIL Disassembler für alle verdächtigen Benutzer zu verwenden Baugruppen.

  1. Öffnen Sie Dll, klicken Sie auf Ctr + M und gehen Sie zum Ende des Bildschirms. Möglicherweise sehen Sie einen Verweis auf eine solche .NET 4-Assembly:

AssemblyRef # 1 (23000001)

%Vor%
  1. Suchen Sie den Typ, der von dieser .NET-Assembly usinf Ref # als Suchkriterien geladen wird. Dies ist ein Beispiel für einen Typ, den Sie auf dem Bildschirm finden können

    TypeRef # 18 (01000012)

    Token: 0x01000012
    Auflösung: 0x23000001
    TypeRefName: System.Runtime.CompilerServices.CompilationRelaxationsAttribute

  2. Untersuchen Sie, warum dieser Typ verwendet wird.

Aktualisierung: Haben Sie versucht, MSBuild Project Build Output Ausführlichkeit auf der Seite Tools \ Optionen \ Projekte und Lösungen \ Build And Run auf "Detailliert" zu setzen und anschließend die Lösung neu zu erstellen? Möglicherweise sehen Sie etwas in ResolveAssemblyReference target

    
Dmitry Harnitski 06.06.2012 03:55
quelle
1

Ich hatte dieses Problem und verwendete CheckAsm, um festzustellen, dass eine meiner eigenen Assemblys aus irgendeinem seltsamen Grund auf eine .NET 4.0-Version einer 3rd-Party-Bibliothek Bezug nahm, während die App selbst .NET 2.0 war. Ich habe alle Instanzen dieser Assembly von meiner Festplatte gelöscht (es lagen viele Kopien herum), die Lösung neu aufgebaut und alles war gut.

    
Dylan Nicholson 06.12.2013 01:17
quelle
1

In meinem Fall wurde die Assembly deinstalliert und alle Referenzen (meines Wissens) wurden entfernt.

Gefunden in der app.config:

%Vor%

Die dependentAssembly wurde gelöscht und meine App funktionierte wieder.

    
event.er 20.12.2016 05:48
quelle
0

Meine Vermutung ist, dass die DLL eines Drittanbieters diejenige ist, für die keine bestimmte Version auf True gesetzt ist und die Ihr Problem verursacht.

    
Shiv 24.09.2013 01:06
quelle
0

Ich hatte auch dieses Problem, und event.er führte mich zur Lösung. Ich hatte folgendes in meiner app.config:

%Vor%

Ich habe newVersion in "2.0.0.0" geändert und die Lösung erstellt.

    
Henrik Olsson 08.02.2017 09:04
quelle