ILMerge ne fusionner les assemblées, ce qui est agréable, mais parfois, pas tout à fait ce que vous voulez. Par exemple, lors de l'assemblée en question est fortement nommées par l'assemblée, et vous n'avez pas de clé pour cela, alors vous ne pouvez pas faire ILMerge sans rupture de cette signature. Ce qui signifie que vous devez déployer plusieurs assemblées.
Comme une alternative à ilmerge, vous pouvez incorporer une ou plusieurs assemblées des ressources dans votre exe ou DLL. Puis, au moment de l'exécution, lorsque les assemblages sont en cours de chargement, vous pouvez extraire intégré à l'assemblée de la programmation, et de la charge et de l'exécuter. Il semble difficile, mais il ya juste un peu de code réutilisable.
Pour le faire, de l'incorporation d'une assemblée, comme vous le feriez d'intégrer d'autres ressources (image, fichier de traduction, de données, etc). Ensuite, mettre en place un AssemblyResolver qui est appelée lors de l'exécution. Il devrait être créé dans le constructeur statique de démarrage de la classe. Le code est très simple.
static NameOfStartupClassHere()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Resolver);
}
static System.Reflection.Assembly Resolver(object sender, ResolveEventArgs args)
{
Assembly a1 = Assembly.GetExecutingAssembly();
Stream s = a1.GetManifestResourceStream(args.Name);
byte[] block = new byte[s.Length];
s.Read(block, 0, block.Length);
Assembly a2 = Assembly.Load(block);
return a2;
}
Le Nom de la propriété sur la ResolveEventArgs paramètre est le nom de l'assemblée pour être résolu. Ce nom fait référence à la ressource, et non pour le nom de fichier. Si vous incorporez le fichier nommé "MyAssembly.dll" et d'appeler la ressource incorporée "Foo", puis le nom que vous voulez ici est "Foo". Mais que serait source de confusion, donc je suggère d'utiliser le nom de fichier de l'assemblée pour le nom de la ressource. Si vous avez intégré et un nom à votre assemblée correctement, vous pouvez simplement appeler GetManifestResourceStream() avec le nom de l'assemblage et de la charge de l'assemblage de cette façon. Très simple.
Cela fonctionne avec plusieurs assemblages, tout aussi bien qu'avec un unique intégré de l'assemblée.
Dans une application réelle, vous allez vouloir une meilleure gestion des erreurs dans cette routine, comme si il n'y a aucun cours d'eau par le nom donné? Qu'advient-il si la Lecture échoue? etc. Mais ce qui reste à faire pour vous.
Dans le reste du code de l'application, vous utilisez les types de l'assemblée que la normale.
Lorsque vous générez l'application, vous devez ajouter une référence à l'assemblée en question, comme vous le feriez normalement. Si vous utilisez les outils en ligne de commande, utilisez l'option /r dans csc.exe; si vous utilisez Visual Studio, vous aurez besoin de "Ajouter une Référence..." dans le menu déroulant sur le projet.
Au moment de l'exécution, de l'assemblée de vérification de version et de vérification fonctionne comme d'habitude.
La seule différence est que dans la distribution. Lorsque vous déployez ou distribuer votre application, vous ne devez pas distribuer le fichier DLL pour l'embarqué (et de référence) de l'assemblée. Il vous suffit de déployer l'assemblage principal; il n'y a pas besoin de distribuer les autres assemblées, parce qu'ils sont incorporés dans l'EXE ou DLL.