2009-07-15 9 views
4

Ich hoffe, dass es nur etwas einfaches ist, dass ich hier vermisse. Ich versuche, zwei separate Projekte zu haltenWie kann ich zwei separate Projekte verwalten, aber sie zu einer DLL zusammenführen?

ProjectName.Core & 
ProjectName.Infrastructure 

Das in einer typischen Zwiebel Architektur hergestellt ist, so kann ich locker Paar meiner Dienste und eine größere Flexibilität gewinnen. Das Infrastrukturprojekt verweist auf das Core-Projekt. Einmal kompiliert, erzeugen sie diese DLLs

ProjectName.Core.dll & 
ProjectName.Infrastructure.dll 

Aber ich möchte, dass es nur 1 DLL erzeugt.

ProjectName.Infrastructure.dll (or even ProjectName.dll) 

Ich habe versucht, ILMerge zu verwenden, um diese Operation auszuführen, aber da Core Infrastructure Referenzen es eine Ausnahme auslöst, weil es den Core-DLL nicht finden kann. Es sieht offensichtlich nicht in sich selbst aus.

Jetzt muss ich die einzelnen Projekte erhalten, weil ich einige andere Kombinationen haben, die Core- und ein anderes Projekt verweisen, die zusammen wie

verbunden werden
ProjectName.Core & 
ProjectName.DataAccess & 
ProjectName.Web 

EDIT: Meine aktuelle Lösung zuruft ILMerge mit ein Nant-Build-Skript. Es wurde erfolgreich zusammengeführt. Aber wenn ich versuche, die zusammengeführte DLL zu verwenden, wird eine Ausnahme ausgelöst, weil die Core-Bibliothek nicht gefunden werden kann.

<target name="merge.core"> 
    <property name="temp.dir" value="${build.dir}\Temp\"/> 
    <mkdir dir="${temp.dir}" if="${not directory::exists(temp.dir)}"/> 
    <property name="tools.dir" value="&quot;${directory::get-current-directory()}\Tools\&quot;"/> 
    <exec program="Tools\ILMerge\ILMerge.exe" workingdir="."> 
     <arg value="/t:Library"/> 
     <arg value="/ndebug"/>  
     <arg value="/out:&quot;${build.dir}\Temp\ProjectName.Infrastructure.dll&quot;"/> 
     <arg value="&quot;${build.dir}ProjectName.Core.dll&quot;"/> 
     <arg value="&quot;${build.dir}Xceed.Compression.dll&quot;"/> 
     <arg value="&quot;${build.dir}ProjectName.Infrastructure.dll&quot;"/> 
     <arg value="&quot;${build.dir}ProjectName.Infrastructure.XmlSerializers.dll&quot;"/> 
    </exec> 
    <delete file="${build.dir}ProjectName.Core.dll"/> 
    <delete file="${build.dir}Xceed.Compression.dll"/> 
    <delete file="${build.dir}ProjectName.Infrastructure.dll"/> 
    <delete file="${build.dir}ProjectName.Infrastructure.XmlSerializers.dll"/> 
    <move file="${build.dir}\Temp\ProjectName.Infrastructure.dll" tofile="${build.dir}ProjectName.Infrastructure.dll"/> 
    <delete dir="${temp.dir}" if="${directory::exists(temp.dir)}"/> 
    </target> 

Um ein wenig klarer zu sein. Ich kann Objekte aus der Core-Bibliothek, aber nicht aus der Infrastruktur-Bibliothek verwenden. Wenn .NET versucht, eines dieser Objekte zu instanziieren, versucht es anscheinend, die Abhängigkeit zu laden, kann sie jedoch nicht finden.

+1

Oder Sie könnten nur zwei DLLs versenden und damit fertig sein. Nur gesagt ... –

+0

Das stimmt auch. Wir liefern heute mit allen DLLs und ich versuche, es für die Benutzer zu vereinfachen. –

Antwort

1

Da ich weiß, das ist nicht möglich in Visual Studio ist, aber Sie können jedes Projekt als NetModule zusammenstellen und dann als DLL miteinander verbinden. Kompilieren Sie wie folgt aus:

csc misource1.cs misource2.cs misource3.cs /target:module 

und verknüpfen Sie dann zusammen mit dem Al.exe-Tool finden Sie .netmodule Files as Linker Input und C# Assemblies.

+0

Ja. Ich kann auch alles als Teil meines Nant-Build-Skripts angeben.Aber ich möchte zusätzliche Arbeit der Wartung des Skripts und der MSBUILD-Projektdateien für jedes Projekt vermeiden. –

4

Verwenden Sie ILMerge. Es funktioniert aus der Box, um dies zu tun.

0

Die neueste Version von ILMerge hat eine /closed Option, die auf dem transitive Schließung der fusionierten Baugruppen arbeitet. Es löst genau dieses Problem (siehe Abschnitte 2.6 Closed und 4.1 Input assembly not merged in correctly im ILMerge.doc Benutzerhandbuch).

Hinweis: Wenn Ihre Bibliothek versucht, Objekte aus einer Assembly mit dem Namen dynamisch zu laden, funktioniert sie nicht, da der Name der zusammengeführten Assembly vom ursprünglichen Assemblynamen abweicht. Es gibt nichts, was ILMerge in diesem Fall tun kann; Sie müssen Ihre Abhängigkeitsinjektion ändern, um dies zu berücksichtigen.