Est-il possible d'instancier un objet au moment de l'exécution si je n'ai que le nom de la DLL et le nom de la classe, sans ajouter de référence à l'assembly dans le projet? La classe implémente une interface, donc une fois que j'instancie la classe, je la caste vers l'interface.
Nom de l'assemblage:
library.dll
Nom du type:
Société.Projet.Classe
EDIT: Je n'ai pas le chemin absolu de la DLL, donc Assembly.LoadFile
ne fonctionnera pas. La DLL peut être à la racine de l'application, system32 ou même chargée dans le GAC.
la source
Type type = assembly.GetType("MyNamespace"+"."+"MyType");
Considérez les limites des différentes
Load*
méthodes. À partir de la documentation MSDN ...Plus d'informations sur les contextes de chargement peuvent être trouvées dans la
LoadFrom
documentation.la source
Activator.CreateInstance devrait fonctionner.
Remarque: le nom du type doit être le type pleinement qualifié.
Exemple:
la source
TypeName
doit être pleinement qualifié. J'ai dû appeler ça comme ça:Activator.CreateInstance("MyAssembly","MyAssembly.TypeName")
Et ça renvoie unObjectHandle
. Pour accéder à votre interface, vous devez le faireObjectHandle.UnWrap()
J'ai trouvé cette question et certaines réponses très utiles, mais j'ai eu des problèmes de chemin, donc cette réponse couvrirait le chargement de la bibliothèque en trouvant le chemin du répertoire bin.
Première solution:
Deuxième solution
Vous pouvez utiliser le même principe pour les interfaces (vous créeriez une classe mais la transtyperiez en interface), comme:
Cet exemple est pour une application Web mais similaire pourrait être utilisé pour l'application de bureau, seul le chemin est résolu de manière différente, par exemple
la source
C'est facile.
Exemple de MSDN:
Voici un lien de référence
https://msdn.microsoft.com/en-us/library/25y1ya39.aspx
la source
À partir de Framework v4.5, vous pouvez utiliser Activator.CreateInstanceFrom () pour instancier facilement des classes dans des assemblys. L'exemple suivant montre comment l'utiliser et comment appeler une méthode en passant des paramètres et en obtenant la valeur de retour.
la source
Oui. Je n'ai aucun exemple que j'ai fait personnellement disponible pour le moment. Je posterai plus tard quand j'en trouverai. En gros, vous utiliserez la réflexion pour charger l'assemblage, puis pour extraire les types dont vous avez besoin.
En attendant, ce lien devrait vous aider à démarrer:
Utilisation de la réflexion pour charger des assemblys non référencés au moment de l'exécution
la source
la source
Vous pouvez charger un assembly à l'aide des méthodes * Assembly.Load **. En utilisant Activator.CreateInstance, vous pouvez créer de nouvelles instances du type souhaité. Gardez à l'esprit que vous devez utiliser le nom de type complet de la classe que vous souhaitez charger (par exemple Namespace.SubNamespace.ClassName ). En utilisant la méthode InvokeMember de la classe Type , vous pouvez appeler des méthodes sur le type.
De plus, tenez compte du fait qu'une fois chargé, un assembly ne peut pas être déchargé tant que tout l'AppDomain n'est pas déchargé (il s'agit essentiellement d'une fuite de mémoire).
la source
En fonction de la façon dont ce type de fonctionnalité est intrinsèque à votre projet, vous voudrez peut-être envisager quelque chose comme MEF qui se chargera du chargement et de la liaison des composants pour vous.
la source
Ainsi, de cette façon, vous pouvez utiliser des fonctions non avec get methodinfo, puis l'invoquer. Vous ferez comme ceci instanceOfMyType.MethodName (); Mais vous ne pouvez pas utiliser Intellisense car les types dynamiques sont tapés au moment de l'exécution, pas au moment de la compilation.
la source
Oui, vous souhaiterez utiliser la méthode statique Load sur la classe Assembly, puis appeler puis appeler la méthode CreateInstance sur l'instance Assembly qui vous est retournée par l'appel à Load.
En outre, vous pouvez appeler l'une des autres méthodes statiques commençant par "Load" sur la classe Assembly, selon vos besoins.
la source
Vous pouvez faire ces choses de cette façon:
la source