2009-03-29 8 views
3

Quelle est la meilleure pratique pour regrouper un assemblage dans un autre? J'ai une assemblée que je distribue, mais j'ai quelques assemblées tierces que j'utilise, et je ne veux pas en distribuer plus d'une. Donc, je voudrais compiler quelques assemblages dans celui que je distribue pour qu'ils soient juste intégrés.Comment charger les assemblages intégrés que vous avez inclus dans votre assemblage principal?

Quelle est la meilleure pratique pour cela? Je sais que je peux mettre les autres assemblées dans mon projet et les mettre en "ressource incorporée", mais comment les obtenir à nouveau, comment l'obtenir à un endroit où je peux instancier des classes définies dans cet assemblage intégré?

J'ai vu la méthode Assembly.Load, mais il semble vouloir un chemin de fichier. Existe-t-il un autre moyen de charger des assemblages intégrés? Comment dites-vous la méthode Load où se trouve l'assembly?

Une fois que vous avez chargé l'assemblage intégré, est-il simplement magique et est-ce que je peux instancier librement des classes?

Répondre

5

Il existe une surcharge Assembly.Load(byte[]) que vous pouvez utiliser pour charger des assemblys à partir d'une matrice mémoire. Si je me souviens bien, c'est ainsi que fonctionne LINQPad par exemple. Voici une façon de le faire, l'assemblage étant donné une instance de System.Reflection.Assembly, contenant d'autres ensembles comme ressources gérées:

Stream embedded = assembly.GetManifestResourceStream ("asm.dll"); 
byte [] buffer = new byte [embedded.Length]; 
using (embedded) { 
    int length = buffer.Length; 
    int offset = 0; 
    while (length > 0) { 
     int read = assemblyStream.Read (buffer, offset, length); 
     if (read == 0) 
      break; 

     length -= read; 
     offset += read; 
    } 
} 

Assembly assembly = Assembly.Load (buffer); 

Le problème avec celui-ci est que le temps d'exécution doivent épingler le tableau d'octets, donc Je suggère d'écrire l'assemblage dans un fichier temporaire et d'utiliser Assembly.LoadFile.

Les deux méthodes renvoient un objet System.Reflection.Assembly, que vous pouvez utiliser pour obtenir des types et ensuite faire ce que vous voulez avec eux.

+0

Quelle est l'étape au-delà, lorsque vous obtenez réellement des cours? Une fois que vous chargez l'assembly et avez un objet Assembly, toutes les classes sont-elles définies dans la portée globale? – Deane

+0

L'assembly est chargé dans l'AppDomain actuel. Vous pouvez ensuite utiliser Assembly.GetType() pour obtenir des types et utiliser Activator.CreateInstance pour les instancier. Comme l'assembly est chargé dynamiquement, vous devez instancier le type dynamiquement. –

5

Je recommanderais l'utilitaire ILMerge, qui combine tous les assemblages en un seul en corrigeant les références au lieu de charger les assemblages d'origine à partir des ressources.

Questions connexes