2010-01-07 3 views
12

Wenn Sie die ASP.NET-Website (anstelle des Webanwendungsmodells) verwenden und einen Verweis auf eine Assembly aus dem lokalen Ordner hinzufügen, scheint Visual Studio davon auszugehen, dass diese lokale Assembly ebenfalls in GAC ist und diese Assembly daher nicht kopiert bin-Ordner (wie bei Nicht-GAC-Assemblys), fügt jedoch einfach einen neuen Datensatz in der web.config-Datei hinzu.Warum referenziert ASP.NET-Website Assembly von GAC, wenn lokale Referenz hinzufügen?

Warum so ein Verhalten? Ist es möglich, eine Kopie in den bin-Ordner zu erzwingen (ich brauche dies, da .dll nicht in der Zielumgebung ist)? Ich kann die Assembly als Datei in den bin-Ordner einfügen und es wird funktionieren, aber in diesem Fall befinden sich die Inhalte der Bin-Ordner in der Quellcodeverwaltung, was nicht gut ist.

Antwort

12

Sie können die Eigenschaft Copy Local für die Referenz auf True setzen. Das sollte es dem Ordner bin hinzufügen - in einem Webanwendungsprojekt.

Wenn Sie jedoch bei einem Website-Projekt eine Referenz hinzufügen, wird lediglich eine Zeile zur web.config hinzugefügt, die auf die Assembly verweist. Es sucht zuerst nach dieser Datei im bin-Ordner und dann in der GAC, wenn sie nicht gefunden wird.

Sie haben zwei Optionen: Sie müssen die Assembly im GAC auf dem Zielcomputer installieren (in diesem Fall ist die XCOPY-Implementierung nicht möglich) oder alle erforderlichen Assemblys in den Ordner bin entweder durch Kopieren oder Schreiben einschließen ein Post-Build-Skript, das dies tut. Sie können die .dll finden, indem Sie die Eingabeaufforderung verwenden und zu c: \ windows \ assembly \ GAC gehen, die gewünschte Assembly suchen, in dieses Verzeichnis wechseln und dann in das Verzeichnis mit der gewünschten Version wechseln gibt Ihnen den Pfad, den Sie in Ihrem Post-Build-Skript verwenden können. Zum Beispiel für die Zugänglichkeit Assembly im GAC, dann würden Sie mit diesem Pfad am Ende: c: \ Windows \ assembly \ GAC \ Zugänglichkeit \ 1.0.5000.0__b03f5f7f11d50a3a \ Accessibility.dll

Sie sagen, einschließlich der Binärordner Inhalt in der Quellcodeverwaltung ist nicht gut. Dies gilt im Allgemeinen für Binärdateien, die Sie erstellen, aber in Ihrem Fall haben Sie binäre Assets, die nicht als Teil Ihres Projekts kompiliert werden. Philosophisch sind diese Bilder äquivalent: binäre Assets, die nicht als Teil Ihres Projekts kompiliert wurden. Ich würde behaupten, dass sie genauso in die Quellcodeverwaltung gehören wie jede andere Binärdatei, auf die sich Ihr Projekt stützt. Aber es ist eine persönliche Entscheidung.

+0

Wie kann ich diese Eigenschaft festlegen? Wenn ich Property Pages der Website öffne, sehe ich eine Liste von Referenzen, aber Copy Local ist dort nicht verfügbar. Bitte beachten Sie, dass dies eine Website ist (keine Webanwendung) – Konstantin

+0

Es ist eine Eigenschaft der Referenz, nicht die Website. Aber ich sehe jetzt, warum Sie angeben, dass es eine Website und keine Webanwendung ist. Ich werde meine Antwort bearbeiten. – Don

+0

Ich habe diese Antwort als akzeptiert markiert, danke Don! Allerdings verstehe ich immer noch nicht die Logik von VS - wenn ich lokale Assembly hinzufügen - warum suchen Sie in GAC und dann verweisen Sie es aus dem GAC? – Konstantin

4

Zur Laufzeit müssen Assemblys an einem von zwei Orten sein: dem Ausgabepfad des Projekts oder dem globalen Assemblycache (siehe Arbeiten mit Assemblys und dem globalen Assemblycache). Wenn das Projekt eine Referenz auf ein Objekt enthält, das sich nicht an einer dieser Stellen befindet, muss die Referenz beim Erstellen des Projekts in den Ausgabepfad des Projekts kopiert werden. Die CopyLocal-Eigenschaft gibt an, ob diese Kopie erstellt werden muss. Wenn der Wert wahr ist, wird die Referenz kopiert. Wenn false, wird die Referenz nicht kopiert.

Das Projekt zugewiesenen Wert von Copylocal wird in der folgenden Reihenfolge ermittelt:

  1. Wenn die Referenz ein anderes Projekt ist, ein Projekt zu Projekt Referenz genannt wird, dann wird der Wert wahr ist.
  2. Wenn die Assembly im globalen Assemblycache gefunden wird, ist der Wert false.
  3. Als ein Sonderfall ist der Wert für die mscorlib.dll-Referenz falsch.
  4. Wenn die Assembly im Framework SDK-Ordner gefunden wird, ist der Wert false. Ansonsten ist der Wert wahr.

this helps

s

6

Wenn Sie ein Website-Projekt in Visual Studio verwenden und eine Referenz auf die GAC-Version statt auf einen anderen Ordner verweist (z. B. lib), müssen Sie eineerstellenDatei in Ihrem/bin-Ordner, wobei xxxx die anstößige DLL ist, auf die Sie verweisen.

Dies wird Build-Probleme mit MSBuild zu lösen, wo der Server erwartet, dass die DLL in der GAC sein wird. Die .refresh-Datei ruft die Datei vom richtigen relativen Pfad ab, um Builds korrekt auszuführen.

Verwandte Themen