2009-12-10 3 views
7

Dies ist eines dieser Dinge, die so einfach sind, dass niemand jemals einfach herauskommt und es in einem der Tutorials sagt, die ich gelesen habe.Werden .NET-Projekte in Visual Studio immer in eine einzige Datei kompiliert?

Ich habe ein paar eigenständige .NET-Anwendungen sowie einige DLL-basierte Plug-Ins für andere Programme erstellt. Ich habe festgestellt, dass ein Projekt in Visual Studio, zumindest mit Windows-Anwendungen und Klassenbibliotheken, in eine einzige Datei (EXE oder DLL) kompiliert.

Ist das immer der Fall? Wenn ich eine größere Anwendung organisiere, sollte ich immer an Projekte in Visual Studio denken, die einer einzigen Datei im endgültigen Programm entsprechen?

Antwort

3

Jedes Projekt in eine einzelne Datei nicht kompiliert. (Außer für Website-Projekte)

Wenn Sie jedoch die Build-Aktion für eine Datei im Projekt auf Immer kopieren oder Neu kopieren setzen, kopiert das Projekt diese Datei in den Ausgabeordner.
Wenn ein EXE-Projekt eine App.config-Datei enthält, wird es ebenfalls in den Ausgabeordner kopiert.

Wenn Ihr Projekt eine DLL referenziert, die nicht Teil des Kernframeworks ist, wird diese DLL in den Ausgabeordner des Projekts kopiert, was zu zwei Dateien führt (obwohl nur eine davon vorhanden ist) enthält den Code aus dem Projekt selbst)

Zusätzlich zu DLLs und EXEs erstellt Visual Studio auch eine PDB-Datei mit Debugsymbolen im Ausgabeordner. Diese Datei wird vom Debugger verwendet und darf nicht an Ihre Benutzer verteilt werden. (Außer Sie wollen, dass sie Ihren Code für Sie debuggen)

1

Für Visual Studio, ja. Suchen Sie im Internet nach "netmodule" und Sie werden die Dokumentation finden, die Sie suchen. Ich bin heute zufällig auf sie gestoßen, als wir mehrere Projekte in einer einzigen DLL zusammenstellen wollten.

MSDN: http://msdn.microsoft.com/en-us/library/226t7yxe(VS.80).aspx

+0

Netmodule sind das Gegenteil. Ich wurde auch von ihnen getäuscht. Netmodules ermöglichen es Ihnen, die Assembly in mehrere Dateien aufzuteilen (zB um sie separat zu laden). Sie sind den normalen referenzierten DLLs sehr ähnlich. Als Link-Status können Sie mit netmodules eine "multifile assembly" erstellen. –

1

Nicht unbedingt. Wenn Ihr Projekt über kulturorientierte Ressourcen verfügt, werden diese in der Regel in separate Assemblys (DLLs) kompiliert. Auch ASP.Net-Projekte werden nicht in eine einzelne Assembly kompiliert, Sie haben immer entweder Ihre aspx/ascx-Dateien oder ihre Marker-Entsprechungen getrennt vom kompilierten Code.

+2

_Website Projects_ werden nicht in eine einzelne Assembly kompiliert - sie werden überhaupt nicht kompiliert. _Web Application Projects_ _do_ wird in eine einzelne Assembly kompiliert. –

+0

Guter Punkt - alle Web-Sachen, die ich mache, ist ein Web-App-Projekt, also habe ich vergessen, den Unterschied zu erwähnen :) – slugster

+2

Wenn Sie Web Deployment-Projekte verwenden, können Sie sie immer noch zu einer einzigen Assembly kompilieren. Aspnet_merge.exe führt die Magie aus. –

2

Für Ihre einfachen Projekte erhalten Sie immer eine Baugruppe pro Projekt. Wenn Sie jedoch zu mehr produktionsfertiger Software übergehen, ist die Antwort anders. Nehmen wir an, Sie möchten eine DLL bereitstellen, aber sie enthält Text, der einem Benutzer angezeigt werden muss. Wahrscheinlich möchten Sie diesen Text lokalisieren (stellen Sie englische und deutsche Versionen oder sogar US-Englisch und Großbritannien-Englisch zur Verfügung [denke Programm gegen Programm]). Sie platzieren Ihren Text in Ressourcen und kompilieren diese Ressourcen dann zu Satellitenassemblies. Sie erhalten eine Satelliten-Assembly für jedes Gebietsschema, das Sie unterstützen möchten.

Hier ist ein kurzer Überblick nach unten auf, wie Satelliten-Baugruppen zu erzeugen und zu verwenden: http://sanjaysainitech.blogspot.com/2007/08/satellite-assemblies.html

ich Leute über netmodules und ILMerge sprechen sehen. Ich denke, wenn Sie sich über Netmodule Sorgen machen, dann tun Sie etwas falsch, weil Sie nicht die Tools verwenden, die Microsoft Ihnen gegeben hat (oder Sie sind in Mono Land, in welchem ​​Fall Sie keine Werkzeuge von Microsoft haben). Ich habe ILMerge nicht benutzt, aber nachdem ich darüber gelesen habe, bin ich mir nicht sicher, ob ich ihm vertraue. This person sagt, es funktioniert gut, außer für WPF/XAML-Code; this person hatte Probleme beim Zugriff auf eingebettete Ressourcen nach dem Ausführen von ILMerge; this person sah optimierten Code, der nicht mithilfe eines Debuggers nach dem Ausführen von ILMerge schrittweise geändert werden konnte.Das sind genug Informationen, um mir zu sagen, dass ILMerge kein produktionsfertiges Werkzeug für alle Szenarien ist. Ein Teil der Entwicklung von Software ist herauszufinden, wie Sie es bereitstellen. Wenn Sie eine kleinere Anzahl von Assemblys bereitstellen möchten, sollten Sie Ihre Software auf diese Weise entwerfen, anstatt nach dem Kompilieren in der IL herumzureden. Wie Kartographen sagten: "Hier sind Drachen."

2

Beispiel, wie mehrere Module und Link Thema in einer einzigen DLL erstellen:

csc /t:module RarelyUsedTypes.cs 
csc /out:AllTypes.dll /t:library /addmodule:RarelyUsedTypes.netmodule AllTypes.cs 

Weitere Informationen finden Sie Richters Buch CLR via C#.

Sie können diesen Prozess für Visual Studio automatisieren.

Erstellen Sie für jedes Ihrer Projekte ein Netmodul oder eine Assembly und kompilieren/fusionieren Sie alle zu einer einzigen Assembly.

Erste Alternative. Dies wurde von Jay R. Wren vorgeschlagen:

Dies ist ein netter Hack, aber mit dem CSC und VBC sowohl der Unterstützung der /target:module und /addmodule Optionen, könnten Sie eigentlich diese nur ohne ILMerge tun, indem Sie einen Shell-Skript verwenden oder Datei erstellen.

Visual Studio unterstützt den Typ "netmodule" nicht, MSBuild jedoch.

Fügen Sie Ihrer Lösung das VB-Projekt hinzu. Entladen Sie das Projekt und bearbeiten Sie die Projektdatei.

ändern Output Modul:

<OutputType>module</OutputType> 

Statt einen Verweis auf das gewünschte Projekt hinzufügen, fügen wir ein Modul. Leider schlägt VStudio hier fehl, aber MSBUILD funktioniert gut. Entladen Sie das Projekt und bearbeiten Sie die Projektdatei. Fügen Sie eine Elementgruppe mit AddModules include-Direktiven hinzu.

<ItemGroup><AddModules Include="..\VbXml\bin\Debug\VbXml.netmodule" /></ItemGroup> 

Dieses msbuild sagen wird CSC sagen /addmodule Richtlinien zu verwenden, ebenso wie die Referenzelementgruppe, das Studio verwalten hat.

Hauptnachteil: Kein Visual Studio Intellisense für das hinzugefügte Modul. Wir haben bereits Referenzen, es ist schade, dass wir keine Module haben. [UPDATE: Wie @ Ark-Kun wies darauf hin, kann Visual Studio .netmodule Projekte und Intellisense verweisen. Fügen Sie einfach die Projektreferenz hinzu, BEVOR Sie den Ausgabetyp ändern.]

SharpDevelop hat den ersten Schritt, aber der zweite Schritt, eine "Add Module" GUI, wurde seit SD 2.0 als niedriger Priorität geöffnet.

Zweite Alternative. Diese great article (von Scott Hanselman) beschreibt, wie Assemblys automatisch gruppiert werden, wenn Sie Visual Studio verwenden.Es tut geben Sie IntelliSense-Unterstützung , im Gegensatz zur ersten Alternative .

+0

Alle drei Wege produzieren eine einzige Baugruppe. Aber nur der dritte Weg gibt dir eine einzige ** Datei **. –

+0

Können Sie dies näher ausführen: "Hinzufügen einer Elementgruppe mit AddModules include Direktiven." Das Setzen des ' ...' innerhalb des '' Tags des' .csproj' verletzt das Schema. –

+0

@ Ark-Kun: Schemaverletzung sollte kein Problem sein. Ich würde sie als Hinweis darauf betrachten, dass etwas nicht in Ordnung ist (es sei denn, Sie müssen keine Verletzungen haben). –

Verwandte Themen