C# 创建二级AppDomain挂起

C# 创建二级AppDomain挂起,c#,.net,mono,appdomain,C#,.net,Mono,Appdomain,我有两个主要方法的程序集 第一个执行另一个 第二个程序集在新的AppDomain中创建一个对象 该对象将要在屏幕上创建文件或打印某些内容 第一个部件(简化示例): 第二条: class MainClass { public static void Main(string[] args) { var domain = AppDomain.CreateDomain("name"); Console.WriteLine ("A");

我有两个主要方法的程序集

  • 第一个执行另一个
  • 第二个程序集在新的AppDomain中创建一个对象
  • 该对象将要在屏幕上创建文件或打印某些内容
第一个部件(简化示例):

第二条:

class MainClass
{
    public static void Main(string[] args)
    {
        var domain = AppDomain.CreateDomain("name");
        Console.WriteLine ("A");

        domain.CreateInstance(Assembly.GetExecutingAssembly().FullName,
            typeof(Run).FullName, false, 0, null, 
            new object[0], null, new object[0]);

        Console.WriteLine ("B");
        new ManualResetEvent(false).WaitOne();
    }
}

class Run
{
    public Run()
    {
            File.Create("something");
            Console.WriteLine ("C");
    }
}
结果因我执行的程序而异

如果我运行第二个
,我会得到:

A
C
B
然后创建文件。我将其视为第二个应用程序有效的证据

当我首先运行主程序时,我只得到:

A
并且该文件不会出现。应用程序不会崩溃,但会挂起

我已经在.NET4和Mono2.10.9以及3.0.3(~git-head)上验证了它

为什么呢?我怎样才能克服这个问题? ==编辑==(在.NET上测试)

我越来越糊涂了

我的
路径到SecondAssembly
有问题。当二进制文件在save文件夹中时,一切似乎都很好(在.NET4.0上测试过,但我也假设mono)

当我使用相对路径或指向不同目录的路径时,结果如下所示:

  • 在VisualStudio2010的调试中,我得到了
    FileNotFoundException
    ,但显示了一个
信息:

Could not load file or assembly 'test2, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null' or one of its dependencies.
第一个程序集中的行出现异常:

new Task(() => domain.ExecuteAssembly(PathToSecondAssembly)).Start();
  • 在没有调试的情况下运行时,只打印A,但不会发生任何事情
这样就找到了程序集(打印了一个),但不知何故出现了异常


我真的不知道为什么。某种权限问题?如何克服这种情况?

我曾经遇到过一个类似的问题(我没有做同样的事情,但是从第二个域创建第三个域的失败让我记忆犹新,然后FileNotFoundException证实了“我的恐惧”)

没有什么好的证据不能解决的。 正如MSDN所述:

证据 定义构成安全策略决策输入的信息集。该类不能被继承

那么就这么做吧:

class MainClass
{
  public static void Main(string[] args)
  {  
    var currentEvidence = AppDomain.CurrentDomain.Evidence;
    var domain = AppDomain.CreateDomain("server", securityInfo: currentEvidence);
    new Task(() => domain.ExecuteAssembly(PathToSecondAssembly)).Start();
    new ManualResetEvent(false).WaitOne(); //wait forever
  }
}
如果您计划启动第四个域(等等),请继续将证据从一个“委托人”传递给另一个“受托人”:


希望这就是问题所在。

如果删除File.Create,会发生什么情况?我已检查,没有更改,应用程序仍然挂起。我添加了这个文件,所以我肯定会看到应用程序的一些效果-我不知道Console.WriteLine是否会在这种情况下实际写入。无法复制(.NET 4.5)。在这两种情况下,所有3个
WriteLine
s都会出现。在调试时,执行会在哪里暂停?@Dhawalk-我现在无法验证,但我明天会尝试。我做了一个编辑,因为在Mono上结果有点不同。还有,我明天试试。
class MainClass
{
  public static void Main(string[] args)
  {  
    var currentEvidence = AppDomain.CurrentDomain.Evidence;
    var domain = AppDomain.CreateDomain("server", securityInfo: currentEvidence);
    new Task(() => domain.ExecuteAssembly(PathToSecondAssembly)).Start();
    new ManualResetEvent(false).WaitOne(); //wait forever
  }
}
class MainClass
{
  public static void Main(string[] args)
  {
    var evAgain = AppDomain.CurrentDomain.Evidence;
    var domain = AppDomain.CreateDomain("name", securityInfo: evAgain);
    Console.WriteLine ("A");

    domain.CreateInstance(Assembly.GetExecutingAssembly().FullName,
        typeof(Run).FullName, false, 0, null, 
        new object[0], null, new object[0]);

    Console.WriteLine ("B");
    new ManualResetEvent(false).WaitOne();
  }
}