如何在另一个 AppDomain 中调用方法

Posted

技术标签:

【中文标题】如何在另一个 AppDomain 中调用方法【英文标题】:How do I call a method in another AppDomain 【发布时间】:2014-05-05 17:36:23 【问题描述】:

如何调用我在另一个 AppDomain 中创建的对象的方法?我想避免使用CreateInstanceFromAndUnwrap,因为这需要我引用我想要操作的 DLL。

public static void Main() 
    // Create domain
    AppDomain domain = AppDomain.CreateDomain("Foo");

    // Load assembly
    domain.Load("C:\\Foo.dll");

    // Create instance of class
    System.Runtime.Remoting.ObjectHandle inst
        = domain.CreateInstance("C:\\Foo.dll", "MyNamespace.MyClass");

    // Call method -- How can I do this ???
    object result = inst.PleaseCallMethod("MyMethod", "param1", 42, "p3", null);

Foo.dll 我会:

namespace MyNamespace 
    public class MyClass 
        public string MyMethod(string p1, int p2, string p3, string p4) 
            return "...";
        
    

另外,我如何调用静态方法,而不首先创建包含它的(可能是静态的)类的实例?

【问题讨论】:

how to call a method of a class from another appDomain 的可能重复项 @NathanA 确实,其他问题似乎相似。您能否回答您链接到的问题?目前,最好的答案是“使用 MarshalByRefObject。酷!没想到这么简单,哈哈~~~”,至少可以说是相当无益的。我的对象确实实现了MarshallByRef,但我仍然不知道如何写inst.PleaseCallMethod(name, params) Remoteing 被视为"legacy technology",您能否详细解释一下您的设置以及您正在尝试做什么。也许我们可以为您指出正确的使用方法。 @ScottChamberlain 我在 .dll 中有一个方法在被另一个软件调用时会崩溃,但是当我自己在一个独立的可执行文件中调用它时运行平稳,所以我的猜测是另一个软件与.dll一起加载了一些“废话”,这使其崩溃,我认为在单独的应用程序域中运行该方法会将其与“废话”隔离开来。我使用CreateInstanceFromAndUnwrap 得到了一些快速而肮脏的东西,但我想知道如何仅使用CreateInstance 来做到这一点。 【参考方案1】:

您可以致电:

domain.DoCallBack(() => Console.WriteLine("DoCallBack: 0", AppDomain.CurrentDomain.FriendlyName));

但这需要将运行代码的程序集加载到新的应用程序域中。

如果您的新 appdomain 具有不同的基本路径和/或需要新 appdomain 中的运行时无法解析的程序集,您可能需要创建一个隔离的条目程序集,您在 DoCallBack 中调用并从此加载组件从他们想要的位置。

【讨论】:

以上是关于如何在另一个 AppDomain 中调用方法的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 AppDomain 内的程序集中调用静态方法 [重复]

从不同的 AppDomain 调用 SignalR 方法

如何在另一个 AppDomain 中处理静态连接

C# 在 appdomain 调用方法中加载 dll,而不会再次加载 dll

使用 C++ 调用 C# 时无法在另一个应用程序域中创建对象