c# - 如何从不同应用程序域中的类库调用实例方法?

标签 c# reflection appdomain

我知道有很多类似的答案,但没有一个适合我。我有一个名为 MyLibrary 的类库。它只有一种类型。我将在另一个应用程序域中创建我的类型的实例,这就是我不使用 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方法的正确方法是什么?我可以从测试类型创建和调用静态方法,但我对非静态实例方法无能为力?

最佳答案

阅读本文以获取更多信息:How to load DLL in separate domain and use its methods?

您应该使用代理类(在本例中为 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;
        }
    }

关于c# - 如何从不同应用程序域中的类库调用实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41026702/

相关文章:

c# - 仅作为时间将时间字符串转换为 24 小时制

c# - 文本框第一个字母到标题大小写的类

ASP.NET 全局/静态存储?

java - 使用反射,我可以确定 Java static final 字段是否将被内联吗?

c# - 资源文件 (.resx) 与反射访问嵌入式资源

c# - 由于过时的 CAS 政策,寻求替代 AppDomain.CreateDomain(string, evidence)

c# - 读取string intern pool的内容

c# - ASP.Net MVC 上的防伪系统

javascript - 数据列表中缺少数据复制

c# - 如何判断方法返回哪个接口(interface)