【问题标题】:Grabbing the process id/name that executed my managed assembly/hosts CLR runtime (CLR runtime host location)获取执行我的托管程序集/主机 CLR 运行时的进程 ID/名称(CLR 运行时主机位置)
【发布时间】:2011-08-14 00:43:19
【问题描述】:

我正在使用一些代码在本机进程中启动 CLR 运行时,然后调用我的 .NET DLL 以在该进程中加载​​另一个 .NET 可执行文件。

要加载我正在使用反射的其他 .NET 可执行文件,如下所示:

Assembly.Load(file).EntryPoint.Invoke(null, null);

现在,我注入一个启动运行时的 C++ dll,然后它调用 .NET dll,后者使用 Assembly.Load 将另一个 .NET 可执行文件加载到内存中并执行它。

一旦 dll 加载我的 .NET 可执行文件,调用:

System.Reflection.Assembly.GetExecutingAssembly().Location;

甚至

Process.GetCurrentProcess().MainModule.FileName;

这当然会返回可执行文件本身的位置,即使它在另一个主机进程中运行。有什么方法可以获取该主机进程的名称吗?进程资源管理器显示它在主机进程中运行,所以我知道该部分工作正常。

当然,如果我要在首先加载的 .NET DLL 中运行这些命令,那么它将显示正确的进程名称。

谢谢。

编辑:

我也试过GetEntryAssembly()GetCallingAssembly()

【问题讨论】:

    标签: c#


    【解决方案1】:

    不要那样做。

    您不得将 .NET 框架注入到任何不属于您的进程中。它可能已经加载了不同的框架或希望稍后加载不同的框架版本。

    可以通过调用GetModuleFileName(GetModuleHandle(NULL));获取宿主进程的名称(两个 API 调用都是 P/Invoke。[1][2])。

    【讨论】:

    • 对不起,Lundberg,但我不能相信你的编辑,因为 StackOverflow 不会修复他们的可访问性错误。
    【解决方案2】:

    如果我正确理解您的问题,那么您想找到“父进程”...有不同的方法可以做到这一点,无论是托管还是通过 P/Invoke...有关如何执行此操作的漂亮代码示例,请参阅How to get parent process in .NET in managed way

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-09
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      相关资源
      最近更新 更多