如何从不同应用程序域中的 class 库调用实例方法?
How to invoke instance method from class library in different appdomain?
我知道有很多类似的答案,但其中 none 适合我。我有一个名为 MyLibrary 的 class 图书馆。它只有一种类型。我将在另一个应用程序域中创建我的类型的实例,这就是我不使用 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 类型创建和调用静态方法,但我不能对非静态实例方法做任何事情?
阅读这篇文章以获取更多信息:How to load DLL in separate domain and use its methods?
您应该使用代理 class(在本例中为加载程序)。我从上面的文章中更改了一部分代码。现在 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;
}
}
我知道有很多类似的答案,但其中 none 适合我。我有一个名为 MyLibrary 的 class 图书馆。它只有一种类型。我将在另一个应用程序域中创建我的类型的实例,这就是我不使用 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 类型创建和调用静态方法,但我不能对非静态实例方法做任何事情?
阅读这篇文章以获取更多信息:How to load DLL in separate domain and use its methods?
您应该使用代理 class(在本例中为加载程序)。我从上面的文章中更改了一部分代码。现在 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;
}
}