如何从不同appdomain的类库中调用实例方法?

Posted

技术标签:

【中文标题】如何从不同appdomain的类库中调用实例方法?【英文标题】:How to invoke instance method from class library in different appdomain? 【发布时间】:2016-12-07 20:24:34 【问题描述】:

我知道有很多类似的答案,但没有一个适合我。我有一个名为 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方法的正确方法是什么?我可以从测试类型创建和调用静态方法,但我对非静态实例方法无能为力?

【问题讨论】:

【参考方案1】:

阅读本文以获取更多信息: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;
        
    

【讨论】:

以上是关于如何从不同appdomain的类库中调用实例方法?的主要内容,如果未能解决你的问题,请参考以下文章

winform如何全局调用一个外部的类?

从 Core 3 的类库中的渲染/处理的 Razor 页面中将 html 作为字符串返回

如何从另一个 appDomain 调用类的方法

如何在类库中使用重定向(url)方法?

如何在没有 DI 的类库中使用 ILogger<Class>

从不同的 AppDomain 调用 SignalR 方法