2008-09-02 8 views
16

Je travaille sur un module pour un CMS. Ce module est distribué en tant que DLL de bibliothèque de classes.Liaison statique en C#

J'ai plusieurs bibliothèques utilitaires que j'aimerais utiliser dans ce module. Y at-il de toute façon je peux lier ces bibliothèques statiquement donc je n'aurai pas à distribuer plusieurs DLL (distribuant ainsi mes bibliothèques utilitaires séparément)?

Je voudrais avoir une seule DLL.

Répondre

23

Vous pouvez fusionner vos nombreuses DLL avec ILMerge:

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

N'a pas essayé moi-même. J'espère que cela aide.


Télécharger ici:
http://www.microsoft.com/downloads/details.aspx?familyid=22914587-B4AD-4EAE-87CF-B14AE6A939B0&displaylang=en

Brève description(de téléchargement pages)
ILMerge est un utilitaire pour fusionner plusieurs ensembles .NET en un seul ensemble de .NET. Il fonctionne aussi bien sur les exécutables que sur les DLL et propose plusieurs options pour contrôler le traitement et le format de la sortie. Voir la documentation d'accompagnement pour plus de détails.

+1

Comme Seb l'a mentionné, ILMERGE le fera - mais une mise en garde est qu'aucun des assemblages ne peut contenir de code dangereux. –

+5

Le code dangereux est très bien. Il ne traitera pas des assemblages en mode mixte. Type qui contient du code non géré et a été créé par un projet C++/CLI. –

2

La réponse courte est non! Vous ne pouvez pas lier dans une DLL pendant la compilation. Je ne sais pas s'il existe une façon subtile de le faire, mais vous devrez probablement distribuer les dll avec vos cms. Le meilleur moyen de le faire est de rendre une sorte de redistribuable.

+0

Non true. Regardez la réponse de Kagamar. Regardez aussi la section des commentaires pour le commentaire de Mike Barnett. – Kobor42

+2

@ Kobor42: Faux, ce n'est pas la liaison qui fusionne. Tandis que la réponse la plus mise à jour répond à l'intention de la question (et est ainsi la réponse la plus utile), la réponse de Khébbie est en fait la bonne, tant que l'on répondrait précisément à la question posée. Vous ne pouvez même pas lier une DLL en C/C++, vous avez besoin d'une archive statique pour le faire ... –

+0

Il est hilarant que cette réponse, qui est techniquement correcte, n'a pas de upvotes. C# est un langage géré, et même ILMerge est un assemblage-fusion et non un éditeur de liens. Un éditeur de liens, tel que compris par les développeurs C++ et C, ne peut pas actuellement exister dans .NET tel qu'il existe actuellement. Cependant, une technologie ".Net native" qui n'a pas encore été publiée à la mi-2015, pourrait un jour être publiée, permettant une application entièrement compilée (sans MSIL), qui pourrait ensuite être liée statiquement. –

12

Si vous ne souhaitez pas utiliser ILMerge, voir cette page:

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

ndlr: conseils Jeffrey Richter pour mettre vos dll dans le fichier exe en tant que ressources (Pour chaque fichier DLL vous ajoutez, affichez ses propriétés et modifiez son "action de construction" en "ressource incorporée."). Ensuite, un chargeur de classe personnalisé est nécessaire pour que l'exécutable fonctionne (Lors de l'exécution, le CLR ne pourra pas trouver les assemblys DLL dépendants, ce qui constitue un problème.Pour corriger cela, lorsque votre application est initialisée, enregistrez une méthode de rappel avec l'événement ResolveAssembly de l'AppDomain).

Assurez-vous de changer la chaîne resourceName pour qu'elle corresponde à vos ressources réelles. (Par exemple, remplacez AssemblyLoadingAndReflection par le nom de votre projet.)

+1

Tant mieux! Solution Nativ sur un outil tiers. Regardez la section des commentaires pour le commentaire du créateur ILMerge ... – Kobor42

+2

Bien que cela demande un petit effort supplémentaire, cela semble être la meilleure solution par rapport à la réponse acceptée. – CubicleSoft

Questions connexes