2016-12-07 1 views
1

Je sais qu'il y a beaucoup de réponses similaires, mais aucune ne me convient. J'ai une bibliothèque de classe appelée MyLibrary. Il a seulement un type. Je vais créer une instance de mon type dans un autre domaine pour lequel je n'utilise pas Activator.Comment faire pour invoquer la méthode d'instance de la bibliothèque de classes dans différents appdomain?

public class Test 
    { 
     public Test() 
     { 
      Console.WriteLine("Ctor of Test type."); 
     } 

     public void Hello(string name) 
     { 
      Console.WriteLine($"Hello {name}! I'm an instance method."); 
     } 
    } 

J'ai créé une application console simple. Ceci est un code de la méthode Main.

static void Main(string[] args) 
     { 
      string path = @"example of my path"; 
      AppDomain domain = AppDomain.CreateDomain("mydomain"); 
      Assembly mylibrary = Assembly.LoadFrom(path); 
      Type typeOfTest = mylibrary.GetType("MyLibrary.Test"); 
      var instanceOfTest = domain.CreateInstanceFrom(path, typeOfTest.FullName); 
      MethodInfo hello = typeOfTest.GetMethod("Hello"); 
      hello.Invoke(instanceOfTest, new object[] {"Bob"}); 
     } 

Quelle est la bonne méthode pour appeler la méthode Hello? Je peux créer et appeler une méthode statique à partir du type Test mais je ne peux rien faire avec la méthode d'instance non statique?

Répondre

1

Lire cet article pour obtenir plus d'informations: How to load DLL in separate domain and use its methods?

Vous devez utiliser la classe proxy (chargeur dans ce cas). J'ai changé une partie du code de l'article ci-dessus. Maintenant, la méthode Call prend votre domaine d'application personnalisé.

public class Loader : MarshalByRefObject 
    { 
     object CallInternal(string dll, string typename, string method, object[] parameters) 
     { 
      Assembly a = Assembly.LoadFile(dll); 
      object o = a.CreateInstance(typename); 
      Type t = o.GetType(); 
      MethodInfo m = t.GetMethod(method); 
      return m.Invoke(o, parameters); 
     } 

     public static object Call(AppDomain domain, string dll, string typename, string method, params object[] parameters) 
     { 
      Loader ld = (Loader)domain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Loader).FullName); 
      object result = ld.CallInternal(dll, typename, method, parameters); 
      AppDomain.Unload(domain); 
      return result; 
     } 
    }