2017-07-21 4 views
0

Ich habe ein Projekt, das externe Baugruppen verwendet, die sich in einem/libs-Ordner befinden. Wenn ich das Projekt erstelle, möchte ich nicht alle diese Assemblies in den Ordner bin kopieren, da sie bereits in/libs sind! Also setze ich CopyLocal = false, aber der Compiler kann diese Assemblies nicht finden.CopyLocal = false filenotfound

Ich habe this related post gesehen, aber ich bin völlig verloren mit diesem GAC und all diesen C# Details.

Kann mir jemand erklären, warum es so kompliziert ist und nicht nur für den Compiler: Wenn eine Assembly auf Pfad P referenziert wird, lade ich sie auf Pfad P, und wenn Copylocal = false, füge ich sie nicht zu meinem Build hinzu ?

+0

Wenn Sie keine Assemblys mit GAC registrieren oder sich mit Dateipfaden herumärgern möchten, tun Sie sich einen Gefallen und lassen Sie sie im selben Ordner wie Ihre ausführbare Datei. – hoodaticus

+0

Ich würde lieber mit Dateipfaden durcheinander;) Ich möchte verstehen, wie es funktioniert – fazega

+0

Dann Derek hat Ihnen die Antwort gegeben, die Sie akzeptieren sollten. Sie können die Assembly-Auflösungsroutine überschreiben und die DLLs zur Laufzeit selbst mit C# -Code suchen und laden. – hoodaticus

Antwort

1

In der Regel ist ein bin-Ordner als Hauptkomponente Ihres Bereitstellungspakets vorgesehen. In einer sehr einfachen Anwendungsbereitstellung ist alles, was ein Programm benötigt, im bin-Ordner vorhanden. Du könntest den Ordner irgendwo kopieren und es würde funktionieren. Das wird natürlich nicht passieren, wenn Ihre externe Baugruppe nicht da ist.

Sie finden, dass diese Baugruppen nicht an zwei Stellen auf Ihrem Entwicklungscomputer vorhanden sein sollten, und ich verstehe, warum Sie das nicht mögen. Der Grund dafür, dass CopyLocal standardmäßig auf "true" gesetzt ist, liegt darin, dass das oben beschriebene typische Szenario die Kosten für die doppelte Bereitstellung von Assemblys auf einem Entwicklungscomputer in Anspruch nimmt. In der Regel wird eine Anwendung auf vielen Clientcomputern häufiger als auf Entwicklungscomputern ausgeführt. Daher ist die Einfachheit eines einzelnen Bereitstellungsordners die Kosten für Festplattenspeicher auf Dev-Computern wert.

Sie haben selbst gesagt, dass Sie den lib-Ordner immer dann einfügen würden, wenn Sie Ihre exe jemand anderem geben würden? Wäre es nicht einfacher, dem bin-Ordner einfach alles zu geben?

In Ihrer ursprünglichen Frage, Sie erwähnen, dass der Compiler die Assemblys nicht finden kann, ich denke, das ist falsch und ich habe eine ähnliche Situation getestet. Der Compiler hat die Assembly gefunden, aber als ich versuchte, den Code auszuführen, sagte mir die Runtime, dass sie ihn nicht finden konnte. Der Compiler fügt keinen Code ein, damit die ausführbare Datei Assemblys in relativen Pfaden findet. Sie finden das detaillierte Antastverhalten von .Net-externen Baugruppen here. Ihre Exe kann nicht magisch vermuten, dass sich die Assembly in einem lib-Ordner im übergeordneten Ordner befindet.

Sie können all dies umgehen, indem Sie Ihre eigene Assembly-Auflösung codieren, aber wenn Sie nicht für ein paar Kilobyte Speicherplatz hungern, lassen Sie Visual Studio seine Sache machen.

+0

Perfekte Antwort. – fazega

3

Was wäre, wenn Sie dieses Programm mit jemand anderem teilen möchten? Sie müssten ihnen den bin-Ordner und den lib-Ordner geben und vielleicht müssten sie sich im Windows Explorer auf verschiedenen Ebenen befinden (um sie zu finden). Wenn Ihr Programm den bin-Ordner nicht mehr benötigt, muss es wissen, wo es die Dateien finden kann, die es ausführen muss. Eine der einfachsten Methoden besteht darin, die lokale Kopie zu aktivieren, damit sie in den Ordner bin kopiert wird. Sie könnten auch "AssemblyResolve" nachschlagen, aber es ist ein bisschen kompliziert und ich denke nicht, dass Sie sich damit befassen wollen.

+0

Versteh deinen Punkt nicht. Wenn ich jemandem dieses Programm geben muss (was tatsächlich der Fall ist), gebe ich ihm die/libs und die .exe, und die .exe sollte die Assemblies finden, wenn ich ihm sage, dass es in ./libs ist. Ich verstehe nicht den Unterschied zwischen dem Einfügen in/bin und dem Einfügen in/libs. – fazega

+2

@FaZeGa "die .exe sollte die Assemblies finden" Sie müssen das programmieren. Sie haben dem COMPILER gesagt, wo sich die Assemblys befinden, aber nicht die .exe. Standardmäßig ist der.exe wird in der GAC, im aktuellen Ordner suchen, machen Sie mehr [Probing] (https://docs.microsoft.com/en-us/dotnet/framework/deployment/how-the-runtime-locates-assemblies) und dann explodiere. –

Verwandte Themen