【问题标题】:Executing a program as a thread and not as a process将程序作为线程而不是进程执行
【发布时间】:2010-07-02 21:34:57
【问题描述】:

有没有办法将另一个程序(例如记事本)作为线程执行,以便它与我的程序共享相同的内存空间?所以如果我的程序结束了,记事本也会结束,所以记事本不会出现在任务管理器中,只是我的程序?

【问题讨论】:

    标签: c# .net multithreading process


    【解决方案1】:

    不,当然不适用于记事本等非托管应用。

    但是,对于托管应用程序,您可以使用 System.Reflection 中的实用程序加载程序集并开始执行 Main() 方法(或者,更确切地说是入口点)。

    不过,System.Process 类中有一些功能可以帮助您模拟您想要做的事情。

    【讨论】:

      【解决方案2】:

      理论上,您可以执行操作系统加载程序所做的相同工作 - 加载可执行文件,找到主入口点并从您的线程中调用它。

      请注意,您很可能会遇到各种应用程序兼容性问题,因为该可执行文件中的代码不希望它以这种方式执行。

      【讨论】:

      • 这在很多情况下都行不通 - 需要对大量进程范围的信息进行分区。即使像调用 GetModuleHandle(NULL) 或 GetCommandLine() 这样简单的操作也会返回错误的结果。
      • 加载可执行文件并运行它工作。不过,正如我所说, 之后发生的事情是未定义的。 :-)
      • 你对工作有一个有趣的定义:) 它甚至不会进入程序的入口点——查看源代码 WinMainCrtStartup 或 __mainCRTSTtrtup。许多 API 调用无法正常工作。
      • “工作”是指它会开始执行。请注意,我没有说“工作正确”。 :-)
      • 只是为了好玩,我实际上确实查看了__tmainCRTStartup 的源代码,虽然我没有看到太多实际上必然需要失败的东西,但我也没有看到太多问题跳过那个并直接调用WinMain/wWinMain(用于窗口应用程序)或main/wmain(用于控制台应用程序)。 CRT 很可能已经由宿主进程初始化,那么为什么不直接进入特定于进程的代码呢?
      【解决方案3】:

      没有。无论如何,这将是一个非常糟糕的主意,因为它可能会导致各种令人讨厌的事情发生。其他程序将无法知道它应该初始化什么以及托管程序已经初始化了什么等等。

      但是,您可以强制记事本与您的程序一起关闭。只需在应用程序关闭时在您创建的进程上调用 Process.CloseMainWindow(很好)或 Process.Kill(强制它死)。

      【讨论】:

        【解决方案4】:

        不,这是不可能的(除非您尝试在单个进程中创建一些奇怪的虚拟化风格环境。)

        要确保记事本与您的应用程序一起消失,请创建一个作业对象,在启动记事本之前将您的应用程序分配给它。当您的程序关闭时,作业对象将被销毁,作业对象中的所有子进程也将被关闭。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-13
          相关资源
          最近更新 更多