gpt4 book ai didi

c# - 创建二级 AppDomain 挂起

转载 作者:行者123 更新时间:2023-11-30 13:02:49 25 4
gpt4 key购买 nike

我有两个具有 Main 方法的程序集。

  • 第一个执行另一个。
  • 第二个程序集在新的 AppDomain 中创建一个对象。
  • 该对象将要创建一个文件或在屏幕上打印一些东西。

第一个组件(简化示例):

class MainClass
{
public static void Main(string[] args)
{
var domain = AppDomain.CreateDomain("server");
new Task(() => domain.ExecuteAssembly(PathToSecondAssembly)).Start();
new ManualResetEvent(false).WaitOne(); //wait forever
}
}

第二个:

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");
}
}

结果因我执行的程序而异。

如果我运行second Main,我得到:

A
C
B

然后文件就创建好了。我将其视为第二个应用程序有效的证明。

当我运行 first Main 时,我只得到:

A

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

我已经在 .NET 4 和 Mono 2.10.9 和 3.0.3 (~git head) 上验证了它。

这是为什么呢?我怎样才能解决这个问题?

==EDIT==

(在 .NET 上测试)

我越来越糊涂了。

PathToSecondAssembly 有问题。当二进制文件位于保存文件夹中时,一切似乎都很好(在 .NET 4.0 上测试,但我假设也是单声道)。

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

  • 在 Visual Studio 2010 的调试中我得到 FileNotFoundException但显示 A

留言:

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,但随后什么也没有发生。

因此找到了程序集(打印了 A),但不知何故出现了异常。

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

最佳答案

我曾经遇到过类似的问题(我没有做同样的事情,但是从第 2 个域创建第 3 个域的失败在我脑海中涌现,然后 FileNotFoundException 证实了“我的恐惧”)。

没有什么是证据无法解决的。正如 MSDN 所述:http://msdn.microsoft.com/en-us/library/system.security.policy.evidence.aspx

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

所以就这样做:

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
}
}

如果您计划启动第 4 个域(等等),请继续将证据从一个“信任者”传递给另一个“受托者”:

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();
}
}

希望这是问题所在。

关于c# - 创建二级 AppDomain 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14259157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com