2008-09-02 17 views
16

Ich arbeite an einem Modul für ein CMS. Dieses Modul wird als Klassenbibliothek DLL verteilt.Statisch in C# verbinden

Ich habe mehrere Utility-Bibliotheken, die ich gerne in diesem Modul verwenden würde. Kann ich diese Bibliotheken trotzdem statisch verknüpfen, so dass ich nicht mehrere DLLs verteilen muss (dadurch werden meine Utility-Bibliotheken separat verteilt)?

Ich möchte nur eine DLL haben.

Antwort

23

Sie können viele DLLs mit ILMerge fusionieren:

http://research.microsoft.com/~mbarnett/ILMerge.aspx

habe es selbst nicht ausprobiert. Ich hoffe es hilft.


zum Herunterladen:
http://www.microsoft.com/downloads/details.aspx?familyid=22914587-B4AD-4EAE-87CF-B14AE6A939B0&displaylang=en

Kurzbeschreibung(von Download-Seite)
ILMerge ist ein Dienstprogramm für mehr .NET-Assemblies in eine einzige .NET-Assembly zu verschmelzen. Es funktioniert sowohl mit ausführbaren Dateien als auch mit DLLs und bietet verschiedene Optionen zur Steuerung der Verarbeitung und des Formats der Ausgabe. Details finden Sie in der Begleitdokumentation.

+1

Als Seb erwähnt ILMERGE wird dies tun - aber eine Einschränkung ist, dass keine der Assemblys unsafe Code enthalten kann. –

+5

Unsafe-Code ist in Ordnung. Es geht nicht um Mixed-Mode-Assemblies. Die Art, die nicht verwalteten Code enthält und von einem C++/CLI-Projekt erstellt wurde. –

2

Die kurze Antwort dafür ist nein! Sie können eine DLL während der Kompilierung nicht verknüpfen. Ich weiß nicht, ob es eine subtile Möglichkeit gibt, dies zu tun, aber Sie müssten wahrscheinlich die DLLs mit Ihrem cms verteilen. Der beste Weg, dies zu tun ist, eine Art von wieder verteilbar zu machen.

+0

Nicht wahr. Sieh dir Kagamar's Antwort an. Sehen Sie sich auch den Kommentarbereich für den Kommentar von Mike Barnett an. – Kobor42

+2

@ Kobor42: Falsch, das ist nicht verlinken das ist Verschmelzung. Während die am meisten entgegengesetzte Antwort die Absicht der Frage beantwortet (und damit die nützlichste Antwort ist), ist Khebbies Antwort tatsächlich die richtige, solange man die gestellte Frage genau beantworten würde. Sie können nicht einmal eine DLL in C/C++ verbinden, Sie brauchen ein statisches Archiv, um das zu tun ... –

+0

Es ist urkomisch, dass diese Antwort, die technisch korrekt ist, keine upvotes hat. C# ist eine verwaltete Sprache, und selbst ILMerge ist ein Assembly-Merger und kein Linker. Ein Linker, wie er von C++ - und C-Entwicklern verstanden wird, kann derzeit in .NET nicht existieren, so wie er derzeit existiert. Eine ".Net native" -Technologie, die Mitte 2015 noch nicht veröffentlicht wurde, könnte jedoch eines Tages veröffentlicht werden, was eine komplett kompilierte (keine MSIL mehr) Anwendung ermöglicht, die dann statisch verknüpft werden könnte. –

12

Wenn Sie ILMerge nicht verwenden möchten, finden Sie auf dieser Seite:

http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

Anmerkung der Redaktion: Jeffrey Richter Hinweise Ihre DLLs in EXE-Datei als Ressourcen setzen (Für jede DLL-Datei Sie fügen hinzu, zeigen seine Eigenschaften an und ändern seine "Build Action" zu "Embedded Resource".). Dann wird ein benutzerdefiniertes Klassenladeprogramm benötigt, damit die ausführbare Datei funktioniert (Zur Laufzeit kann die CLR die abhängigen DLL-Assemblys nicht finden. Dies ist ein Problem. Um dies zu beheben, registrieren Sie bei der Initialisierung Ihrer Anwendung eine Callback-Methode mit das ResolveAssembly-Ereignis der AppDomain).

Achten Sie darauf, die Zeichenfolge resourceName so zu ändern, dass sie auf Ihre tatsächlichen Ressourcen verweist. (z. B. ändern Sie AssemblyLoadingAndReflection zu Ihrem Projektnamen.)

+1

So viel besser! Nativ-Lösung über Drittanbieter-Tool. Sehen Sie sich den Kommentarbereich für den Kommentar des ILMerge-Erstellers an ... – Kobor42

+2

Während dies ein wenig mehr Aufwand erfordert, scheint dies die bessere Lösung gegenüber der akzeptierten Antwort zu sein. – CubicleSoft

Verwandte Themen