【问题标题】:How do I call a method in another AppDomain如何在另一个 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 "...";
        }
    }
}

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

【问题讨论】:

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

标签: c# remoting appdomain


【解决方案1】:

您可以致电:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2015-06-16
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多