【发布时间】: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来做到这一点。