C# 如何跨AppDomain边界传递强类型MarshallByRefObject?

C# 如何跨AppDomain边界传递强类型MarshallByRefObject?,c#,reflection,C#,Reflection,我有一个场景,我想在父AppDomain和它的子对象之间实现简单的通信。我试图做的事情看起来会奏效,但我遇到了一个障碍,下面的代码片段就是一个例子 该程序会导致消息C::.ctor(System.MarshallByRefObject)找不到构造函数,因此运行时似乎拒绝了构造函数,该构造函数采用了我要传递给CreateInstanceFromAndUnwrap调用的类型的参数。我可以理解为什么实例化B会起作用,我希望C也会起同样的作用,那么为什么不能呢 谢谢 编辑:在Hans指出我第一个示例中的

我有一个场景,我想在父
AppDomain
和它的子对象之间实现简单的通信。我试图做的事情看起来会奏效,但我遇到了一个障碍,下面的代码片段就是一个例子

该程序会导致消息C::.ctor(System.MarshallByRefObject)找不到构造函数,因此运行时似乎拒绝了构造函数,该构造函数采用了我要传递给
CreateInstanceFromAndUnwrap
调用的类型的参数。我可以理解为什么实例化
B
会起作用,我希望
C
也会起同样的作用,那么为什么不能呢

谢谢

编辑:在Hans指出我第一个示例中的一个常见错误后,我对下面的示例代码进行了一个小的更新。因此,尽管我们在子应用程序域上仍然有一个虚构的
ApplicationBase
属性,但我们可以看到加载了正确的程序集,并且可以看到我们试图调用的构造函数

Hans的观察确实使代码正常工作,但我认为我无法将实际的ApplicationBase设置为父域的基础

循环第二次迭代的输出如下:
C
初始加载:mscorlib
展开后:mscorlib
展开后:Foo
无效。ctor(A)
找不到类型“C”上的构造函数


正如Hans指出的,问题在于我的
CreateSetup
函数中的
ApplicationBase
,我在这里纠正了这个问题:

static AppDomainSetup CreateSetup()
{
    return new AppDomainSetup
    {
        ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
        ApplicationName = "bar",
        DisallowBindingRedirects = false,
        ConfigurationFile = "baz",
        LoaderOptimization = LoaderOptimization.MultiDomainHost
    };
}
通过此修改,示例程序将在其子域中实例化
B
C
时正确执行

在此更改之后,我执行的强制程序集加载不是必需的,尽管我仍然无法解释为什么子应用程序域在首先构造
A
对象以加载所需的程序集之后无法解析
C
构造函数


我最好的解释是,在应用程序域中使用默认值时,为其基指定的路径无效,这会导致在探测时,
C

AppDomainSetup.ApplicationBase出现问题。解决A类型是一个鸡和蛋的问题,它找不到包含A的程序集。哦,天哪,我写这篇文章时怎么会错过这个。我真正的问题不应该被这个最小的不起作用的例子抓住。@HansPassant,我已经更新了样本,你介意再看一看吗?你没有解决核心问题,但正在接近。保存A对象的CreateInstanceFromAndUnwrap()调用的返回值,并将该值作为构造函数参数传递。我对A类型的对象执行Create..Unwrap的原因只是为了确保包含C的程序集加载到子域中,因为我想在以后验证构造函数的可见性。类型A的对象最终将成为通信介质,因此我必须在父域中创建它们。谢谢你的帮助,不过汉斯,我确实觉得我离了解这个问题越来越近了。
static AppDomainSetup CreateSetup()
{
    return new AppDomainSetup
    {
        ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
        ApplicationName = "bar",
        DisallowBindingRedirects = false,
        ConfigurationFile = "baz",
        LoaderOptimization = LoaderOptimization.MultiDomainHost
    };
}