web-dev-qa-db-fra.com

Charger un fichier .DLL et accéder aux méthodes de la classe dans?

Je suis complètement nouveau dans le chargement dans des bibliothèques comme celle-ci, mais voici ma position:

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 un peu coincé. Pour autant que je sache, il le charge correctement car il me donne des erreurs lorsque je change de nom.

Que dois-je faire d'ici? Comment charger exactement la classe et les méthodes qu'il contient?

Merci.

26
scrot

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 du type avec un constructeur sans paramètre en utilisant Activator.CreateInstance(type) ou obtenir les constructeurs en utilisant Type.GetConstructors Et les invoquer pour créer des instances.

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

Fondamentalement, une fois que vous avez un type, vous pouvez faire beaucoup de choses - consultez la liste des membres 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.

33
Jon Skeet

C'est ainsi que vous pouvez obtenir les cours 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 de type complet est important. Étant donné que vous n'ajoutez pas le .dll, vous ne pouvez pas faire une utilisation car il n'est pas dans votre projet.

Si vous voulez tout, je voudrais juste répondre à Jon Skeet.

12
David Basarab

Si vous souhaitez dynamiquement charger un assembly, puis invoquer des méthodes à partir des classes qu'il contient, vous devez effectuer une certaine forme d'invocation dynamique.

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

Le seul élément manquant est de savoir comment obtenir le type lui-même, qui peut facilement être récupéré avec du code comme celui-ci:

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

Et si vous voulez simplement utiliser l'assembly de manière statique (en ayant l'assembly disponible au moment de la compilation), la réponse de Launcy ici sur cette page est la voie à suivre.

3
Kenan E. K.