将应用程序作为线程而不是进程运行

时间:2010-07-16 19:57:14

标签: c# .net multithreading process

前段时间,我在这里问了一个关于如何在另一个应用程序的内存空间中运行应用程序而不是一个新进程的问题:Executing a program as a thread and not as a process

作为对这个问题的后续跟踪,我认为我有一个关于如何做到这一点的理论来实现我正在尝试做的事情。首先,让我说,我这样做的原因是因为我正在尝试创建一个可以“测试”其他应用程序的测试床应用程序,但是如果它们得到异常则控制它们,我的测试床应用程序可以结束线程并自动予以限制。

我关于如何做到这一点的理论是创建一个名为ITestBed的接口,并让我的应用程序中的主类实现它。例如,实现将包含一个方法TestApp()。从我的测试床应用程序我需要做的就是调用这个方法,在应用程序端的这个方法可以只镜像我当前对象的构造函数吗?这有用吗?

基本上,我想要做的是模仿Visual Studio的工作原理。如果在程序中设置了断点,单击以在Visual Studio中运行应用程序,则应用程序将作为Visual Studio应用程序的子项运行。要测试这一点,您可以结束visual studio应用程序,您的应用程序也将结束。我怎么能实现这个目标呢?

1 个答案:

答案 0 :(得分:2)

您不需要将其作为单独的线程运行。

使用Process.Start启动流程时,它是当前应用程序的子流程。

只需注意Process.Exited事件(确保将EnableRaisingEvents设置为true),然后使用它查看进程何时退出。然后,您可以在此时自动重新启动该过程。


  

我关于如何做到这一点的理论是创建一个名为ITestBed的接口,并让我的应用程序中的主类实现它。例如,实现将包含一个方法TestApp()。从我的测试床应用程序我需要做的就是调用这个方法,在应用程序端的这个方法可以只镜像我当前对象的构造函数吗?这有用吗?

这会奏效。您可以通过反射加载主exe程序集,并构造主对象,然后调用您的方法。这样做会使当前应用程序成为当前应用程序的一部分 - 因此它会产生一些副作用。在这种情况下,您正在共享进程内存空间。

如果您这样做,您可能需要查看应用程序域。通过在单独的AppDomain中加载和“启动”您的ITestBed实现,您将保护您的主应用程序。