如何在另一个 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 内的程序集中调用静态方法 [重复]