簡體   English   中英

如何從不同appdomain中的類庫調用實例方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM