2010-07-16 49 views
1

前阵子,我问在这里了解如何运行一个应用程序在其他应用程序的内存空间,而不是一个新的进程线程的一个问题:Executing a program as a thread and not as a process运行的应用程序的线程,而不是一个过程

作为这个问题的后续,我认为我有一个关于如何做到这一点的理论,以达到我想要做的事情。首先,让我说,我这样做的原因是因为我试图创建一个测试床应用程序,它可以“测试”其他应用程序,但控制它们,所以如果他们遇到异常,我的测试床应用程序可以结束线程并自动进行抑制。

我的理论如何做到这一点是创建一个接口,例如称为ITestBed,并让我的应用程序中的主类实现这一点。例如,该实现将包含一个方法TestApp()。我需要从我的测试平台应用程序中执行的操作是调用这个方法,并且在应用程序端的这个方法只能镜像我当前对象的构造函数?这会工作吗?

本质上,我试图做的是模仿Visual Studio的工作原理。如果您在程序中设置了一个断点,点击以在Visual Studio中运行应用程序,则您的应用程序将作为Visual Studio应用程序的子节点运行。为了测试这个,你可以结束Visual Studio应用程序,你的应用程序也将结束。我该如何实现这个目标?

+0

[执行程序作为线程而不是进程]的可能重复(http://stackoverflow.com/questions/3169234/executing-a-program-as-a-thread-and-not-as-一个进程) – 2010-07-16 20:05:58

+0

你正在发明一个车轮。至少看看NUnit的源代码:http://launchpad.net/nunitv2/2.5/2.5.5/+download/NUnit-2.5.5.10112-src.zip – 2010-07-16 20:37:16

+0

@HansPassant尊敬的先生,先生: Incase你没有注意到,轮子保持世界运动(飞机,汽车,自行车,滑板......):P。 – SE13013 2015-07-26 04:57:05

回答

2

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

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

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


我如何做到这一点的理论是创建一个接口,称为ITestBed例如并且在我的应用程序的主类中实现这一点。例如,该实现将包含一个方法TestApp()。我需要从我的测试平台应用程序中执行的操作是调用这个方法,并且在应用程序端的这个方法只能镜像我当前对象的构造函数?这会工作吗?

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

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

+1

为了跟进里德的回答:编写一个应用程序很容易,它会搞乱它的整个过程(即使将它隔离到一个AppDomain中)。 *进程*是这类事情的适当工作范围。 Visual Studio使用子进程 - 而不是线程 - 进行调试。 – 2010-07-16 20:12:36

相关问题