C# 多个AppDomains:保持控制台打开

C# 多个AppDomains:保持控制台打开,c#,.net,unit-testing,testing,appdomain,C#,.net,Unit Testing,Testing,Appdomain,我有一个集成测试工具,它在自己的appdomain中同时启动控制台exe数次。一旦任何一个console exe应用程序退出其appdomain,它就会导致其余所有console exe appdomain的stdin、stdout、stderr关闭。也就是说,即使应用程序继续运行,控制台也会关闭。这太糟糕了,因为其他仍然活跃的“控制台应用程序”有额外的材料输出到屏幕上 我想知道是否有办法使控制台保持打开状态,即使其中一个控制台exe appdomains退出,直到我准备好控制台真正关闭为止 出

我有一个集成测试工具,它在自己的appdomain中同时启动控制台exe数次。一旦任何一个console exe应用程序退出其appdomain,它就会导致其余所有console exe appdomain的stdin、stdout、stderr关闭。也就是说,即使应用程序继续运行,控制台也会关闭。这太糟糕了,因为其他仍然活跃的“控制台应用程序”有额外的材料输出到屏幕上

我想知道是否有办法使控制台保持打开状态,即使其中一个控制台exe appdomains退出,直到我准备好控制台真正关闭为止


出于好奇,我的集成测试工具是从VS单元测试框架(vstesthost.exe)执行的。我认为这个细节与问题无关,但我希望控制台在我的测试完成之前保持打开状态。当然,单元测试框架的值不应该依赖于控制台输出,但在调试测试时它会有所帮助。顺便说一句,我正在从单元测试框架运行集成测试这一事实与主题无关。:)

有趣的方法。。。我想知道,即使您解决了这个问题,您打算如何处理std.out和std.err上的并发问题

为了解决整个问题,我已经做过几次了:

  • 创建应用程序域
  • 在新域中创建MarshalByRef对象
  • 将自定义TextWriter传递到新域
  • 通过Console.Set???(TextWriter)替换.Net中的std.err和std.out值
  • 在域中执行一个或多个程序集

  • 希望您能理解,您的自定义文本编写器可以根据需要同步输出。我不知道子应用程序域是否会继承父域的自定义Console.Out/Error,您也可以尝试这样做以简化所需的代码。

    在我的情况下,由vstesthost.exe创建的父应用程序域似乎根本没有控制台Out/Error。不过,这并没有改变你的观点……你不能将这些控制台应用程序作为单独的进程启动?作为集成测试,我可能希望一次执行200个。在我的书中,这是太多的过程。此外,我将在一个进程中获得更好的性能,因为,例如,所有实例都将使用单个线程池。