[英]How to invoke instance method from class library in different appdomain?
我知道有很多類似的答案,但它們都不適合我。 我有一個名為MyLibrary的類庫。 它只有一種類型。 我將創建一個我的類型的實例到另一個appdomain,為什么我不使用Activator。
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方法的正確方法是什么? 我可以從Test類型創建和調用靜態方法,但我對非靜態實例方法無能為力?
閱讀本文以獲取更多信息: 如何在單獨的域中加載DLL並使用其方法?
您應該使用代理類(在本例中為Loader)。 我從上面的文章中更改了部分代碼。 現在,Call方法將使用您的自定義應用程序域。
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.