2009-07-06 3 views
25

Je suis complètement nouveau pour le chargement dans les bibliothèques comme ceci, mais voici où je me tiens:Charger un fichier .DLL et accéder aux méthodes de la classe dans?

J'ai un fichier DLL fait maison, c'est à peu près aussi simple que possible, la classe elle-même et une méthode. Dans le programme d'accueil qui charge cette bibliothèque, j'ai:

Assembly testDLL = Assembly.LoadFile("C:\\dll\\test.dll"); 

De là, je suis coincé. Pour autant que je sache, il charge correctement car il me donne des erreurs quand je change le nom.

Que faire à partir de là? Comment exactement charger les méthodes de classe & à l'intérieur?

Merci.

+0

Y at-il une raison particulière pour laquelle vous devez utiliser la réflexion pour charger dynamiquement cette DLL? sinon, utilisez la réponse de Lunchy. –

Répondre

32

Utilisez Assembly.GetTypes() pour obtenir une collection de tous les types, ou Assembly.GetType(name) pour obtenir un type particulier.

Vous pouvez ensuite créer une instance de type avec un constructeur sans paramètre en utilisant Activator.CreateInstance(type) ou obtenir les constructeurs en utilisant Type.GetConstructors et les appeler pour créer des instances.

De même, vous pouvez obtenir des méthodes avec Type.GetMethods() etc.

En fait, une fois que vous avez un type il y a des tas de choses que vous pouvez faire - regarder les member list pour plus d'informations. Si vous êtes bloqué en essayant d'effectuer une tâche particulière (les génériques peuvent être difficiles), posez simplement une question spécifique et je suis sûr que nous serons en mesure de vous aider.

3

Si vous souhaitez dynamiquement charger un assembly, puis invoquer des méthodes à partir de classes dans celui-ci, vous devez effectuer une certaine forme d'appel dynamique.

Vérifiez here pour des conseils de base à ce sujet.

Le bit ne manquant est comment obtenir le type lui-même, qui peut facilement être récupéré wth code comme ceci:

foreach (Type t in assemblyToScan.GetTypes()) 
     { 
      if(condition) 
       //do stuff 
     } 

Et si vous souhaitez simplement utiliser statiquement l'ensemble (en ayant le montage disponible sur compiler le temps), alors la réponse de Launcy ici sur cette page est la voie à suivre.

11

Voici comment vous pouvez obtenir les classes si vous connaissez le type.

Assembly assembly = Assembly.LoadFrom("C:\\dll\\test.dll"); 

// Load the object 
string fullTypeName = "MyNamespace.YourType"; 

YourType myType = assembly.CreateInstance(fullTypeName); 

Le nom complet du type est important. Puisque vous n'ajoutez pas le fichier .dll, vous ne pouvez pas l'utiliser car il n'est pas dans votre projet.

Si vous voulez tout ce que je voudrais juste répondre Jon Skeet.

+1

Désolé si je creuse cette réponse de la tombe. Je me demandais s'il était possible d'accéder aux Interfaces de la même manière. Autrement dit, si la DLL contient un "MyNamespace.MyInterface", comment y accéder? Par exemple, dans votre exemple, "YourType" est connu du chargeur de DLL. Et si ce n'est pas le cas, mais je le connais et ses méthodes par nom, c'est-à-dire parce qu'elles sont documentées quelque part? – manu3d

+0

@ manu3d Oui, vous pouvez. Fonctionne de la même manière, il suffit de remplacer votre type avec l'interface. –

Questions connexes