2010-10-20 6 views
3

Bonjour, je ferai de mon mieux pour l'expliquer.Comment appeler une fonction dans un fichier .net dll via une interface chargée par réflexion

Fondamentalement, je charge une bibliothèque par réflexion en utilisant le fichier Assembly.LoadFile. De là, j'ai une interface IFace qui définit une méthode "GetStrings" qui renvoie un tableau de chaînes.

La DLL chargée dynamiquement a une classe nommée "Class1" qui implémente IFace.

J'ai besoin d'un moyen d'appeler cette méthode interfacée via la lib dynamiquement chargée. Je voudrais le garder étroitement couplé, ce qui me laisse me demander ce qu'il faut faire. Je sais que je peux utiliser MethodInvoker pour appeler la méthode, mais je suis en train de trouver un moyen que je peux faire quelque chose comme ceci:

IFace obj = (IFace)ReflectionAssembly.Class1; 
string[] strs = obj.GetStrings(); 

Toutes les idées?

+2

S'il s'agit d'une classe statique, comment peut-elle implémenter une interface? – Ani

+0

Désolé, ce n'est pas une classe statique, GetStrings renvoie un tableau statique de chaînes. Ma faute. – Dave

Répondre

5

Quelque chose comme:

var assm = Assembly.Load("ClassLibrary1"); 
    var type = assm.GetType("ClassLibrary1.Class1"); 
    var instance = Activator.CreateInstance(type) as IFace; 
    string[] strings = instance.GetStrings(); 
+0

Ça l'a fait, merci. – Dave

1

Une fois que vous avez le type par réflexion (en utilisant quelque chose comme Assembly.GetType), vous pouvez utiliser Activator.CreateInstance:

IFace obj = (IFace)Activator.CreateInstance(class1Type); 
string[] strs = obj.GetStrings(); 
2

Utilisez Assembly.CreateInstance() pour créer l'objet , passez-lui un «nom bien connu». Convertissez la valeur de retour en IFace, le reste est facile. Oh, n'utilisez pas LoadFile, utilisez LoadFrom.

Questions connexes