【发布时间】:2010-07-02 21:34:57
【问题描述】:
有没有办法将另一个程序(例如记事本)作为线程执行,以便它与我的程序共享相同的内存空间?所以如果我的程序结束了,记事本也会结束,所以记事本不会出现在任务管理器中,只是我的程序?
【问题讨论】:
标签: c# .net multithreading process
有没有办法将另一个程序(例如记事本)作为线程执行,以便它与我的程序共享相同的内存空间?所以如果我的程序结束了,记事本也会结束,所以记事本不会出现在任务管理器中,只是我的程序?
【问题讨论】:
标签: c# .net multithreading process
不,当然不适用于记事本等非托管应用。
但是,对于托管应用程序,您可以使用 System.Reflection 中的实用程序加载程序集并开始执行 Main() 方法(或者,更确切地说是入口点)。
不过,System.Process 类中有一些功能可以帮助您模拟您想要做的事情。
【讨论】:
理论上,您可以执行操作系统加载程序所做的相同工作 - 加载可执行文件,找到主入口点并从您的线程中调用它。
请注意,您很可能会遇到各种应用程序兼容性问题,因为该可执行文件中的代码不希望它以这种方式执行。
【讨论】:
__tmainCRTStartup 的源代码,虽然我没有看到太多实际上必然需要失败的东西,但我也没有看到太多问题跳过那个并直接调用WinMain/wWinMain(用于窗口应用程序)或main/wmain(用于控制台应用程序)。 CRT 很可能已经由宿主进程初始化,那么为什么不直接进入特定于进程的代码呢?
没有。无论如何,这将是一个非常糟糕的主意,因为它可能会导致各种令人讨厌的事情发生。其他程序将无法知道它应该初始化什么以及托管程序已经初始化了什么等等。
但是,您可以强制记事本与您的程序一起关闭。只需在应用程序关闭时在您创建的进程上调用 Process.CloseMainWindow(很好)或 Process.Kill(强制它死)。
【讨论】:
不,这是不可能的(除非您尝试在单个进程中创建一些奇怪的虚拟化风格环境。)
要确保记事本与您的应用程序一起消失,请创建一个作业对象,在启动记事本之前将您的应用程序分配给它。当您的程序关闭时,作业对象将被销毁,作业对象中的所有子进程也将被关闭。
【讨论】: