获取执行托管程序集/主机CLR运行时(CLR运行时主机位置)的进程id/名称

本文关键字:主机 运行时 CLR 进程 id 名称 位置 获取 执行 程序集 | 更新日期: 2023-09-27 18:05:45

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

加载另一个。net可执行文件,我使用反射,像这样:

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

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

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

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

或者

Process.GetCurrentProcess().MainModule.FileName;

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

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

谢谢。编辑:

我也试过GetEntryAssembly()GetCallingAssembly()

获取执行托管程序集/主机CLR运行时(CLR运行时主机位置)的进程id/名称

不要这样做。

你不能将。net框架注入到任何不是你的进程中。它可能已经加载了不同的框架,或者希望稍后加载不同的框架版本。

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

如果我正确理解了你的问题,那么你想找到"父进程"…有不同的方法可以做到这一点,无论是管理还是通过P/Invoke…有关如何做到这一点的代码示例,请参阅如何以托管方式在。net中获得父进程