2011-08-14 21 views
5

我正在使用一些代碼在本機進程中啓動CLR運行時,然後調用.NET DLL加載另一個。該進程中的.NET可執行文件。抓取執行我的託管程序集/主機CLR運行時(CLR運行時主機位置)的進程ID /名稱

要加載我使用反射,其他.NET可執行文件,像這樣:

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

現在,我注入了C++ DLL啓動運行,然後調用它採用集的.NET的DLL。加載將另一個.NET可執行文件加載到內存中並執行它。

一旦DLL加載我的。NET的可執行文件,美其名曰:

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

甚至

Process.GetCurrentProcess().MainModule.FileName; 

這當然,返回的可執行文件本身的位置,儘管其內部運行的另一個主機進程。有什麼方法可以獲取該主機進程的名稱?進程資源管理器顯示它在主機進程內運行,所以我知道我的那部分工作正常。

當然,如果我要在首先加載的.NET DLL中運行這些命令,那麼它會顯示正確的進程名稱。

謝謝。

編輯:

我試圖GetEntryAssembly()GetCallingAssembly()爲好。

回答

4

不要這樣做。

您可能不會將.NET框架注入到任何不屬於您的進程中。它可能已經加載了不同的框架,或者希望稍後加載不同的框架版本。您可以通過調用GetModuleFileName(GetModuleHandle(NULL))來獲取主機進程的名稱; (這兩個API調用都是P/Invoke。[1][2])。

+0

對不起,Per Lundberg,但我不能信任你編輯,因爲StackOverflow不會修復他們的可訪問性錯誤。 – Joshua

0

如果我理解你的問題正確,那麼你要找到「父進程」 ......有不同的方法來做到這一點,無論是管理或通過P/Invoke的......關於如何做到這一點很好的代碼示例請參閱How to get parent process in .NET in managed way

相關問題