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

C# 如何在另一个AppDomain中调用方法,c#,remoting,appdomain,C#,Remoting,Appdomain,如何对在另一个AppDomain中创建的对象调用方法?我希望避免使用CreateInstanceFromAndUnwrap,因为这需要我引用我想要操作的DLL public static void Main() { // Create domain AppDomain domain = AppDomain.CreateDomain("Foo"); // Load assembly domain.Load("C:\\Foo.dll"); // Creat

如何对在另一个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 "...";
        }
    }
}
另外,如果不先创建可能包含静态方法的静态类的实例,如何调用静态方法?

您可以调用:

domain.DoCallBack(() => Console.WriteLine("DoCallBack: {0}", AppDomain.CurrentDomain.FriendlyName));
但这需要将运行代码的程序集加载到新的appdomain中

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

您可以调用:

domain.DoCallBack(() => Console.WriteLine("DoCallBack: {0}", AppDomain.CurrentDomain.FriendlyName));
但这需要将运行代码的程序集加载到新的appdomain中


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

可能重复@NathanA,另一个问题似乎类似。然后,请您提供您所链接问题的答案,好吗?目前,最好的答案是使用MarshallByRefObject。凉的我没想到会这么容易,哈哈~~~~,至少可以说这是没有用的。我的对象确实实现了MarshallByRef,但我仍然不知道如何编写inst.PleaseCallMethodname,params。远程被认为是一个问题,您能否解释更多关于您的设置和尝试执行的操作。也许我们可以给你指出正确的使用方法。@ScottChamberlain我在.dll中有一个方法,当另一个软件调用它时会崩溃,但当我自己在独立的可执行文件中调用它时会运行平稳,所以我猜另一个软件与.dll一起加载了一些垃圾,导致它崩溃,我认为在一个单独的appdomain中运行这个方法会将它与那些垃圾隔离开来。我在使用CreateInstanceFrommanDunwrap时得到了一些快速而肮脏的东西,但我想知道如何使用CreateInstance来实现这一点。可能是@NathanA的重复的确,另一个问题似乎类似。然后,请您提供您所链接问题的答案,好吗?目前,最好的答案是使用MarshallByRefObject。凉的我没想到会这么容易,哈哈~~~~,至少可以说这是没有用的。我的对象确实实现了MarshallByRef,但我仍然不知道如何编写inst.PleaseCallMethodname,params。远程被认为是一个问题,您能否解释更多关于您的设置和尝试执行的操作。也许我们可以给你指出正确的使用方法。@ScottChamberlain我在.dll中有一个方法,当另一个软件调用它时会崩溃,但当我自己在独立的可执行文件中调用它时会运行平稳,所以我猜另一个软件与.dll一起加载了一些垃圾,导致它崩溃,我认为在一个单独的appdomain中运行这个方法会将它与那些垃圾隔离开来。我在使用CreateInstanceFromAndUnwrap时得到了一些快速而肮脏的东西,但我想知道如何使用CreateInstance来实现这一点。