2016-12-07 3 views
1

似たような回答がたくさんあることは知っていますが、どれも私には適していません。私はMyLibraryというクラスライブラリを持っています。 1つのタイプしかありません。自分のタイプのインスタンスを別のappdomainに作成して、なぜActivatorを使用しないのかを考えます。異なる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."); 
     } 
    } 

私は単純なコンソールアプリケーションを作成しました。これは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"}); 
     } 

Helloメソッドを呼び出す正しい方法は何ですか?テスト型から静的メソッドを作成して呼び出すことはできますが、静的インスタンスメソッドでは何もできません。

答えて

1

より多くの情報を取得するには、この記事を読む:How to load DLL in separate domain and use its methods?

あなたがプロキシクラス(この場合はローダー)を使用する必要があります。私はコードの一部を上記の記事から変更しました。 Callメソッドはカスタムappdomainを取ります。

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; 
     } 
    } 
関連する問題