2010-08-08 4 views
1

Je voudrais accéder aux informations de type d'un assemblage référencé (c'est une référence de projet). La difficulté consisterait à résoudre le chemin du fichier de l'assembly en utilisant la solution VS, et charger l'assembly à partir du fichier, mais je suis sûr que puisque l'assembly référencé est déjà résolu/chargé dans l'assembly en cours d'exécution, mais cette façon m'échappe vraiment. Comment puis-je faire ceci? Par exemple, dans MainAssembly, je fais référence à LibAssembly. Maintenant, dans le code MainAssembly, j'ai besoin d'itérer les membres de types qui sont définis dans LibAssembly.Comment puis-je obtenir des types d'un assemblage référencé?

Répondre

3

La façon la plus simple que je connaisse est d'utiliser la réflexion. Si vous avez une classe appelée MyClass définie dans LibAssembly, à partir de votre assemblage principal, vous pouvez appeler le code comme le suivant:

Type[] types = Assembly.GetAssembly(typeof(MyClass)).GetTypes(); 

Cela vous obtenir tous les types au sein LibAssembly.

Modifier:

Si vous ne connaissez pas l'un des types au préalable et peut supposer que la bibliothèque serait dans le même endroit que l'exécutable, peut-être quelque chose le long des lignes suivantes fonctionnerait:

using System; 
using System.IO; 
using System.Reflection; 

string libraryFileName = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "myLib.dll"); 
Assembly assembly = Assembly.LoadFrom(libraryFileName); 
Type[] myTypes = assembly.GetTypes(); 
+1

'Type [] types = typeof (MyClass) .Assembly.GetTypes();' –

+0

Mon problème est que je ne connais pas forcément un type dans LibAssembly. – ProfK

+0

Ok, je vois, j'ai mis à jour ma réponse avec une solution possible. – nukefusion

3

pour obtenir une liste de toutes les assemblées chargées, vous pouvez essayer de demander au appdomain:

AppDomain MyDomain = AppDomain.CurrentDomain; 
Assembly[] AssembliesLoaded = MyDomain.GetAssemblies(); 
foreach (Assembly MyAssembly in AssembliesLoaded) 
{ 
    // 
} 

Ensuite, vous pouvez parcourir tous les assemblages chargés et obtenir leurs types par réflexion.

+0

Cette approche fonctionne, avec un problème: L'assemblage dont je dois extraire les types n'est pas chargé tant que j'instancie un type de cet assemblage. C'est en quelque sorte un Catch-22, parce que j'essaie de savoir quels types sont dans cet assemblage. – ProfK

Questions connexes