185 votes

Puis-je charger un assembly .NET au moment de l'exécution et instancier un type ne connaissant que le nom?

Est-il possible d'instancier un objet lors de l'exécution si je n'ai que le nom de la DLL et le nom de la classe, sans l'ajout d'une référence à l'assembly dans le projet? La classe implémente une interface, donc une fois que j'instancie la classe, je vais me jeter à l'interface.

Nom de l'Assembly:

library.dll

Nom du Type:

De l'entreprise.Projet.Classname


EDIT: je n'ai pas le chemin absolu de la DLL, Assembly.LoadFile ne fonctionne pas. La DLL peut être à la racine de l'application, system32, ou même chargé dans le GAC.

230voto

Jeff Yates Points 36725

Oui. Vous devez utiliser Assembly.LoadFrom à la charge de l'assemblage en mémoire, vous pouvez utiliser Activator.CreateInstance pour créer une instance de votre modèle préféré. Vous aurez besoin de regarder le type de la première utilisation de la réflexion. Voici un exemple simple:

Assembly assembly = Assembly.LoadFrom("MyNice.dll");

Type type = assembly.GetType("MyType");

object instanceOfMyType = Activator.CreateInstance(type);

Mise à jour

Lorsque vous avez l'assemblée de nom de fichier et le nom du type, vous pouvez utiliser Activator.CreateInstance(assemblyName, typeName) demander .NET type de résolution pour résoudre que dans un type. Vous pourriez étirable avec un try/catch, de sorte que si elle échoue, vous pouvez effectuer une recherche dans les répertoires où vous pouvez spécifiquement de sauvegarder d'autres assemblées qui, autrement, pourraient ne pas être recherchés. Ce serait d'utiliser la méthode précédente à ce point.

35voto

Anthony Mastrean Points 8582

Envisager les limites de la différente Load* méthodes. À partir de la MSDN docs...

LoadFile ne prend pas en charge les fichiers dans le LoadFrom contexte, et ne permet pas de résoudre les dépendances en utilisant le chemin de chargement, comme la méthode LoadFrom.

Plus d'informations sur la Charge Contextes peuvent être trouvées dans l' LoadFrom docs.

19voto

tvanfosson Points 268301

Activator.CreateInstance doit fonctionner.

 IFace object = (IFace)Activator.CreateInstance( "AssemblyName",
                                                "TypeName" )
                               .Unwrap();
 

Remarque: Le nom du type doit être le type qualifié complet.

Exemple:

 var aray = (IList)Activator.CreateInstance("mscorlib","System.Collections.ArrayList").Unwrap();
aray.Add(10);

foreach (object obj in aray)
{
    Console.WriteLine(obj);
}
 

7voto

Sofija Points 118

J'ai trouvé cette question et des réponses très utile, cependant, j'ai des problèmes de chemins, de sorte que cette réponse serait de couvrir de chargement de la bibliothèque par trouver le chemin du répertoire bin.

Première solution:

string assemblyName = "library.dll";
string assemblyPath = HttpContext.Current.Server.MapPath("~/bin/" + assemblyName);
Assembly assembly = Assembly.LoadFrom(assemblyPath);
Type T = assembly.GetType("Company.Project.Classname");
Company.Project.Classname instance = (Company.Project.Classname) Activator.CreateInstance(T);

Deuxième solution

string assemblyName = "library.dll";
string assemblyPath = HttpContext.Current.Server.MapPath("~/bin/" + assemblyName);
Assembly assembly = Assembly.LoadFile(assemblyPath);
(Company.Project.Classname) instance = (Company.Project.Classname) assembly.CreateInstance("Company.Project.Classname");

Vous pouvez utiliser le même principe pour les interfaces (vous serait la création d'une classe, mais la coulée de l'interface), tels que:

(Company.Project.Interfacename) instance = (Company.Project.Interfacename) assembly.CreateInstance("Company.Project.Classname");

Cet exemple est l'application web, mais similaire pourrait être utilisée pour une application de Bureau, la seule voie est résolu de manière différente, par exemple

Path.GetDirectoryName(Application.ExecutablePath)

2voto

Giovanni Galbo Points 8139

Oui. Je n'ai aucun exemple que j'ai fait personnellement pour le moment. Je posterai plus tard quand j'en trouverai. Fondamentalement, vous utiliserez la réflexion pour charger l'assemblage et ensuite tirer tous 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X