我有两个带有 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");
}
}
结果因我执行的程序而异。
如果我运行第二个 Main
,我会得到:
A
C
B
并创建文件。我将其视为第二个应用程序有效的证据。
当我运行第一个 Main
时,我只得到:
A
并且文件没有出现。应用程序不会崩溃,但会挂起。
我已经在 .NET 4 和 Mono 2.10.9 和 3.0.3 (~git head) 上验证了它。
这是为什么?我怎么能覆盖这个问题?
==编辑==
(在 .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),但不知何故出现了异常。
我真的不知道为什么。某种权限问题?如何克服这种情况?