跨应用程序域调用的最简单方法是什么?

12

我需要在另一个应用程序域中调用对象的方法(传递参数并获取结果)。有什么想法吗?

更新:两个应用程序域都不是由我的代码创建的(宿主应用程序创建它,然后调用我的代码)。我如何从另一个应用程序域中访问一个应用程序域?

2个回答

14
如果您在另一个域中创建了对象,例如使用AppDomain.CreateInstanceAndUnwrap,那么在另一个域中调用该对象的方法只需要直接调用即可,因为实际上该对象是通过代理从另一个域公开的。
最简单的跨应用程序域调用方式就是直接调用该对象,其实该对象是通过其代理从另一个域中公开的。 更新
不幸的是,获取主机域并不容易。您应该枚举像这样的域,并在其中找到主机域。我假设您的主机域是一个使AppDomain.IsDefaultAppDomain方法返回true的域。

我完全忘记了那个方法。实际上比使用DoCallBack要方便得多 ;) - Oliver Hanappi
不错!使用这种方式可以进行回调吗? - user626528
2
@user626528 是的,但不仅仅是对象的一个方法回调。如果您在另一个域中创建一个对象,则会在该域中调用其所有方法。我想您应该创建一些类来负责回调,然后通过AppDomain.CreateInstanceAndUnwrap在另一个域中创建该类的实例,最后在另一个域中调用该实例的方法。 - Centro
@user626528 请查看更新。 - Centro

3

通常使用AppDomain.DoCallBack来实现此功能。如果要传递参数,您需要创建一个可序列化的对象,将其方法传递给上述方法。

在回调方法中,您可以执行另一个AppDomain回调,将结果传递回原始AppDomain。


我不知道如何使用它来传递参数或结果。 - user626528
1
@user626528 你不能直接传递参数或获取结果。你可以使用你的应用程序域的SetDataGetData方法来实现。 - Prasad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接