.NET Assembly Referenzen gehen alle zirkulär auf mich

8

Update: Letzte Nacht habe ich entschieden, dass es zu viel Arbeit ist, um den Ordner zu ändern, in dem einige Berichte gespeichert werden. Meine Arbeitsumgebung besteht darin, den Ordner umzubenennen, den Batch-Job auszuführen, den ich erledigen muss, und dann den Ordnernamen wieder in den ursprünglichen Zustand zu ändern. Ich habe das Gefühl, ich könnte den Rest von heute und die ganze nächste Woche damit verbringen und noch nichts zu zeigen haben. Ich würde lieber die Hölle erwischen, wenn ich gegen meinen Chef vorgehe, als nicht in der Lage zu sein, unseren Kunden Rechnung zu stellen (was nur einmal im Jahr geschieht). Vielen Dank an alle, die geholfen haben, ich bin demütig von Ihrer Bereitschaft, einem anonymen Kerl über den Kopf zu helfen. Ich bin mir nicht sicher, wie ich diese Frage "ablegen" soll, aber ich gebe euch immer noch Requisiten, ich lese die FAQ und alle Kommentare während des Mittagessens. Danke.

Ich versuche eine c # -Anwendung zu debuggen, die mein Vorgänger erstellt hat. Er ist ein Programmierer, ich bin ein Systemadministrator, vielleicht bin ich hier falsch.

Wie auch immer, ich muss eine der Assemblies neu kompilieren und sie auf unserem Produktionsserver bereitstellen. Wenn ich es kompiliere, erhalte ich den Fehler:

  

Der Typ 'Mcrcsip.Web.McrcsipWebExceptionBase ist in einer Assembly definiert, auf die nicht verwiesen wird. Sie müssen einen Verweis auf die Assembly 'Mcrcsip.Web, Version = 2.0.3266.28977, Culture = neutral, PublicKeyToken = c3de6c6abcdf794b' hinzufügen.

Ich habe zufällig eine Kopie dieser Assembly, und wenn ich den Verweis auf die vorhandene Assembly lösche (2.0.0.0 mit einem anderen öffentlichen Schlüsseltoken) und einen Verweis auf die Assembly hinzufüge, nach der sie fragt, wenn ich kompiliere, I bekomme diese Fehlermeldung:

  

Der Typ    'Mcrcsip.Web.McrcsipWebExceptionBase    ist in einer Baugruppe definiert, die ist    nicht referenziert Sie müssen ein hinzufügen    Verweis auf Assembly 'Mcrcsip.Web,    Version = 2.0.0.0, Kultur = neutral,    PublicKeyToken = 8bbdde85caf008d0 '.

Wenn ich auf Google nach diesem Fehler suche (natürlich generisch), bekomme ich eine Menge "Ergebnisse einer Assemblyreferenz hinzufügen ..." Ergebnisse.

Wie komme ich von diesem Karussell ab?

So sieht die Lösung aus:

  • Mcrcsip.Amwa.Lösung
    • http://amwa-test.internal.lan/
    • Mcrcsip.Amwa.Core
      • Mcrcsip.Aws.Bol
      • Mcrcsip.Common
      • Mcrcsip.Web
      • nunit.framework
      • System
      • System.Konfiguration
      • System.Data
      • System.Enterprise Services
      • System.Web
      • System.Web.Services
      • System.XML
    • Mcrcsip.Amwa.CrFactory
      • CrystalDecisions.CrystalReports.Engine
      • CrystalDecisions.Enterprise.Framework
      • CrystalDecisions.Enterprise.InfoStore
      • CrystalDecisions.ReportSource
      • CrystalDecisions.Shared
      • CrystalDecisions.Web
      • Mcrcsip.Amwa.Core
      • Mcrcsip.Web
      • System
      • Systemkonfiguration
      • System.Data
      • System.Drawing
      • System.Web
      • System.XML
    • Mcrcsip.Amwa.PdfFormHandler
      • itextsharp
      • Mcrcsip.Amwa.Core
      • Mcrcsip.Web
      • System
      • System.Konfiguration
      • System.Data
      • System.Web
      • System.Xml
    • Mcrcsip.Amwa.Web
      • Mcrcsip.Amwa.Core
      • Mcrcsip.Amwa.CrFactory
      • Mcrcsip.Amwa.PdfFormHandler
      • Mcrcsip.Aws.BOL
      • Mcrcsip.Common
      • Mcrcsip.SharePoint
      • Mcrcsip.Web
      • System
      • Systemkonfiguration
      • System.Data
      • System.EnterpriseServices
      • System.Web
      • System.Web.Services
      • System.XML
    • Mcrcsip.Amwa.WebControls
      • System
      • System.Data
      • System.Design
      • System.Drawing
      • System.Web
      • System.Xml
    • Mcrcsip.Amwa.Setup
Nick 04.03.2010, 18:58
quelle

3 Antworten

7

Referenzinkonsistenzen oder: wie ich gelernt habe, nicht mehr zu beunruhigen und ILDASM zu lieben

ähem, Husten Husten,

Problem

Nick,

Wenn Sie Ihren ursprünglichen Post erneut lesen, ist es offensichtlich, dass Sie ein Problem mit der DLL-Versionsinkonsistenz haben. Das heißt, mindestens ein Projekt in Ihrer Lösung hängt von der Mcrcsip.Web-Version X ab, und mindestens ein Projekt in Ihrer Lösung hängt von der Mcrcsip.Web-Version Y ab [oder noch schlimmer, hängt von einer Bibliothek ab, die von der Mcrcsip.Web-Version Y abhängt ]. Dies kann schwierig und mühsam zu finden sein.

Siehe Empfohlene Lösung , um zum Ende zu springen.

Wie

Diese Art von Inkonsistenz tritt auf, wenn

  1. Sie haben eine Abhängigkeit wie A hängt von B und C ab, B hängt von C ab,
  2. A und B sind ursprünglich gegen C ver 1,
  3. gebaut
  4. A wird aktualisiert und gegen C ver 2,
  5. aufgebaut

Im Gegensatz zu dem, was wir intuitiv erwarten, wird B nicht automatisch auf die Verwendung von C ver 2 aktualisiert, wenn wir A bauen. Sowohl A als auch B müssen auf die gleiche Bibliothek verweisen richtig bauen. Also muss entweder A zu C ver 1 passen, oder B muss neu aufgebaut werden und zu C ver 2 passen.

Nun kann dies bei jeder Projektkonfiguration passieren, weshalb es wichtig ist, Ihre Software zu versionieren [glauben Sie mir, dass dieses Problem schlimmer wird, wenn Sie die \ versionierung nicht richtig signieren] und gut mit Ihrem Team kommunizieren, wenn eine Abhängigkeitsaktualisierung auftritt / p>

Es ist auch wissenswert, dass es zwei Arten von Abhängigkeitsreferenzen gibt, hart und weich [tatsächlich sind sie die gleichen, das sind Links zu dlls, außer dass einer der Spezialfälle des anderen ist, und konzeptionell hilft es Unterscheide die zwei].

Harte Referenzen

Eine harte Referenz ist eine Abhängigkeit eines Projekts von einer statischen DLL. Das heißt, die Abhängigkeit wurde zu einem bestimmten Zeitpunkt erstellt und wird niemals aktualisiert, es sei denn, ihre physische Datei wird durch eine neue ersetzt. Harte Referenzen werden über den Dialog Referenzen hinzufügen zu einer Lösung hinzugefügt und fügen einen Verweis aus den Registerkarten .Net, COM oder Browse hinzu. Harte Referenzen werden typischerweise verwendet, um Abhängigkeiten zu Software hinzuzufügen, die außerhalb des Geltungsbereichs der aktuellen Lösung entwickelt wurde (dh Framework-, Third-Party- und andere First-Party-Produkte, die von anderen internen Teams entwickelt wurden). Harte Referenzen neigen auch dazu, veraltet zu werden, weil sie durch ihren eigenen Entwicklungsstrom gepflegt und aktualisiert werden.

Nehmen Sie das obige Szenario an

  1. Sie haben eine Abhängigkeit wie A hängt von B und C ab, B hängt von C ab,
  2. A und B sind ursprünglich gegen C ver 1,
  3. gebaut
  4. A wird aktualisiert und gegen C ver 2,
  5. aufgebaut

Angenommen, A und B befinden sich innerhalb der gleichen Lösung

  • SimpleSolution
    • A
      • B [Schwerer Hinweis]
      • C v2 [Harte Referenz]
    • B
      • C v1 [Harte Referenz]

Wenn A erstellt wird, erhalten Sie den von Ihnen beschriebenen Fehler. A erwartet ein Objekt von C v2, aber weil B eine harte Abhängigkeit von C v1 hat, wird C v1 zuerst in den Speicher geladen, und es tritt eine Kollision auf. A erwartet v2 und findet v1. Das ist dein Fehler.

Um diese Situation zu lösen, müssen Sie

  1. Aktualisieren Sie das Projekt B hard referenz C v1 bis C v2
  2. Erzwinge die Neuerstellung von Projekt B
  3. Projekt aktualisieren Eine harte Referenz B zu [neu gebaut] B
  4. Erzwinge die Neuerstellung von A

Soft-Referenzen

Eine weiche Referenz ist eine Abhängigkeit eines Projekts von einem anderen Projekt innerhalb derselben Lösung. Das heißt, die Abhängigkeit wird jedes Mal neu erstellt, wenn die gesamte Lösung neu erstellt wird. Soft-Referenzen werden über den Dialog Referenzen hinzufügen zu einer Lösung hinzugefügt und eine Referenz von der Registerkarte Projekte hinzugefügt. Softreferenzen werden in der Regel verwendet, um Abhängigkeiten zu Software hinzuzufügen, die im Rahmen der aktuellen Lösung entwickelt wurde. Sie haben den primären Vorteil, Änderungen an die Konsumenten innerhalb derselben Lösung zu übertragen, wenn sie gemacht werden. Aufgrund dieser Tatsache können weiche Referenzen nicht veraltet sein.

[Dies ist ein spezieller Fall einer harten Referenz, Visual Studio fügt einen Verweis hinzu, der auf den Ausgabepfad des Zielprojekts verweist. Ich glaube, dass dieser Pfad auch aktualisiert wird, wenn das Zielprojekt seine Ausgabekonfiguration ändert - aber sehr praktische Eigenschaft, die Unterscheidung verdient]

Nehmen Sie das obige Szenario an

  1. Sie haben eine Abhängigkeit wie A hängt von B und C ab, B hängt von C ab,
  2. A und B sind ursprünglich gegen C ver 1,
  3. gebaut
  4. A wird aktualisiert und gegen C ver 2,
  5. aufgebaut

Angenommen, A und B befinden sich innerhalb der gleichen Lösung

  • SimpleSolution
    • A
      • B [Soft-Referenz]
      • C v2 [Harte Referenz]
    • B
      • C v1 [Harte Referenz]

Wenn A erstellt wird, erhalten Sie den von Ihnen beschriebenen Fehler. A erwartet ein Objekt von C v2, aber weil B eine harte Abhängigkeit von C v1 hat, wird C v1 zuerst in den Speicher geladen, und es tritt eine Kollision auf.A erwartet v2 und findet v1. Das ist dein Fehler.

Um es zu lösen,

  1. Aktualisieren Sie das Projekt B hard referenz C v1 bis C v2
  2. Erzwinge die Neuerstellung von A

Wie Sie sehen können, sind weiche Referenzen einfacher zu pflegen.

IL DASM [Intermediate Language Disasembling]

Nun, da Sie ein bisschen mehr über Referenzen und Projektwartung wissen, wie genau ermitteln Sie den Status Ihres Builds? Schließlich kann jemand Ihrer Projekte oder ihrer Abhängigkeiten inkonsistent sein.

Der einfache Weg besteht darin, das Build-Ausgabeverzeichnis zu öffnen und das Assembly-Manifest jeder einzelnen DLL zu prüfen, die von Ihrer Lösung erstellt wurde.

Um das Manifest einer Baugruppe zu überprüfen,

  1. öffnen ildasm.exe
    • Für VS2010 ist ildasm über die Verknüpfung
    • verfügbar
    • Öffnen Sie für VS2008 und VS2005 eine Visual Studio-Eingabeaufforderung über die Befehlszeile "ildasm"
  2. öffne eine DLL,
    • klicken Sie auf Datei - & gt; Öffnen oder
    • Drücken Sie Strg-O oder
    • Ziehen Sie Ihre DLL in ildasm window
  3. öffnen MANIFEST
    • Doppelklicken Sie auf den roten Dreiecksknoten MANIFEST
  4. findet Verweise auf Mcrcsip.Web
    • klicken Sie auf "Suchen" und geben Sie "Mcrcsip.Web" in das Dialogfeld ein, oder
    • Drücken Sie Alt-F und geben Sie in das Dialogfeld "Mcrcsip.Web" ein, oder
    • prüft manuell den Inhalt der MANIFEST-Datei
  5. Versionsnummer bestätigen

Das ist langwierig und schmerzhaft, aber wenn Sie einen [nicht-trivialen] Dll-Inkonsistenzfehler entdecken, ist dies der einzige Weg, um ihn zu finden.

Empfohlene Lösung

  1. Stellen Sie sicher, dass Ihre Lösung gegebenenfalls weiche Referenzen verwendet,
    • erweitern Sie Mcrcsip.Amwa.CrFactory
      • Erweitern Sie Referenzen
      • Entfernen Sie den Verweis Mcrcsip.Amwa.Core
      • Öffnen Sie das Dialogfeld Referenzen hinzufügen
      • Öffnen Sie Macrcsip.Amwa.Core auf der Registerkarte Projekte
    • erweitern Sie Mcrcsip.Amwa.PdfFormHandler
      • Erweitern Sie Referenzen
      • Entfernen Sie den Verweis Mcrcsip.Amwa.Core
      • Öffnen Sie das Dialogfeld Referenzen hinzufügen
      • Öffnen Sie Macrcsip.Amwa.Core auf der Registerkarte Projekte
    • erweitern Sie Mcrcsip.Amwa.Web
      • Erweitern Sie Referenzen
      • Entfernen Sie den Verweis Mcrcsip.Amwa.Core
      • Entfernen Sie den Verweis Mcrcsip.Amwa.CrFactory
      • Entfernen Sie den Verweis Mcrcsip.Amwa.PdfFormHandler
      • Öffnen Sie das Dialogfeld Referenzen hinzufügen
      • Öffnen Sie Macrcsip.Amwa.Core auf der Registerkarte Projekte
      • Öffnen Sie "Macrcsip.Amwa.CrFactory" auf der Registerkarte "Projekte"
      • Öffnen Sie Macrcsip.Amwa.PdfFormHandler auf der Registerkarte Projekte
  2. Stellen Sie sicher, dass Ihre Lösung gegebenenfalls neue, harte Referenzen verwendet,
    • erweitern Sie Mcrcsip.Amwa.Core
      • Erweitern Sie Referenzen
      • Entfernen Sie den Verweis Mcrcsip.Aws.Bol
      • Entfernen Sie den Verweis Mcrcsip.Common
      • Entfernen Sie den Verweis Mcrcsip.Web
      • Öffnen Sie das Dialogfeld Referenzen hinzufügen
      • Öffnen Sie "Macrcsip.Aws.Bol" auf der Registerkarte "Durchsuchen" [immer am besten, um den Speicherort anzugeben]
      • Öffnen Sie "Macrcsip.Common" auf der Registerkarte "Durchsuchen"
      • Öffnen Sie Macrcsip.Web vom Browse-Tab
    • erweitern Sie Mcrcsip.Amwa.CrFactory
      • Erweitern Sie Referenzen
      • Entfernen Sie den Verweis Mcrcsip.Web
      • Öffnen Sie das Dialogfeld Referenzen hinzufügen
      • Öffnen Sie Macrcsip.Web vom Browse-Tab
    • erweitern Sie Mcrcsip.Amwa.PdfFormHandler
      • Erweitern Sie Referenzen
      • Entfernen Sie den Verweis Mcrcsip.Web
      • Öffnen Sie das Dialogfeld Referenzen hinzufügen
      • Öffnen Sie Macrcsip.Web vom Browse-Tab
    • erweitern Sie Mcrcsip.Amwa.Web
      • Erweitern Sie Referenzen
      • Entfernen Sie den Verweis Mcrcsip.Aws.Bol
      • Entfernen Sie den Verweis Mcrcsip.Common
      • Entfernen Sie den Verweis Mcrcsip.SharePoint
      • Entfernen Sie den Verweis Mcrcsip.Web
      • Öffnen Sie das Dialogfeld Referenzen hinzufügen
      • Öffnen Sie Mcrcsip.Aws.Bol auf der Registerkarte Durchsuchen
      • Öffnen Sie "Macrcsip.Common" auf der Registerkarte "Durchsuchen"
      • Öffnen Sie Mcrcsip.SharePoint auf der Registerkarte Durchsuchen
      • Öffnen Sie Macrcsip.Web vom Browse-Tab
  3. Erstellen

Wenn bei diesem Schritt weiterhin Fehler auftreten, wissen Sie einen oder alle

  • Mcrcsip.Aws.BOL
  • Mcrcsip.Common
  • Mcrcsip.SharePoint

teilt Ihre Abhängigkeit von Mcrcsip.Web und verweist auf die alte Version. Wenn dies der Fall ist, dann für jeden oben aufgeführten harten Verweis

  1. Wählen Sie eine Referenz
  2. Drücken Sie F4
  3. Kopieren Sie den Inhalt aus der Path-Eigenschaft
  4. Dateidialog öffnen in ildasm
  5. Einfügen in den Dateinamen
  6. inspizieren MANIFEST

Stellen Sie sicher, dass Sie dies für jeden der drei oben genannten harten Referenzen tun. Sobald Sie herausgefunden haben, welche Teilmenge dieser drei auf die alte Version von Mcrcsip.Web verweist, können Sie dieses Projekt jetzt finden, seine Referenz aktualisieren, es neu erstellen und dann Ihr harte Referenz, Wiederaufbau und voila. Bob ist dein Onkel.

Puh.

Le fin

PS entschuldigt sich für Ausführlichkeit. Das ist kein sehr komplexes Problem, aber da Sie sicher sind, dass Sie mir zustimmen, beinhaltet es eine Menge Details.Ich hoffe wirklich, dass das hilft. Danke auch für Ihre Kooperation:)

PPS übrigens, ich folge aus Ihren Kommentaren, dass der ursprüngliche Entwickler überall harte Referenzen verwendete [dh sogar innerhalb derselben Lösung]. vielleicht hatte er seine Gründe, aber ich bin der Esel.

    
johnny g 05.03.2010, 16:48
quelle
0

Wenn Sie mit der rechten Maustaste auf die Referenz klicken, gehen Sie zu den Eigenschaften, wofür ist "Spezifische Version" festgelegt? Stellen Sie sicher, dass es auf 'True' gesetzt ist und die gelistete Version in der Tat 2.0.x ist.

Überprüfen Sie auf der Eigenschaftenseite den Pfad. Möglicherweise haben Sie eine andere Version, die an anderer Stelle in Ihrem GAC registriert ist und Vorrang hat. Verwenden Sie "gacutil -l" in der Befehlszeile, um eine Liste aller registrierten Versionen dieser Assembly zu erhalten. Wenn Duplikate mit unterschiedlichen Schlüsseln angezeigt werden, benutze gacutil, um den nicht gewünschten zu erstellen.

    
Jordan Parmer 04.03.2010 19:17
quelle
0

Beobachten Sie die anderen Builds unter den Batch-Build-Optionen. Auf diese Weise können Sie priorisieren, welche Assembly zuerst erstellt werden soll. Anschließend sollten Abhängigkeiten ihre DLL in der richtigen Reihenfolge abrufen.

    
Will Marcouiller 04.03.2010 21:05
quelle