獲取一個進程的所有dll

耶露
如題,我的問題跟這位大大的一樣
點我連結
我的目的是檢查該應用程式是否有載入自己寫的dll
根據連結的方式我下載了Microsoft.Samples.Debugging.MdbgEngine(1.4.0版)的套件
開發環境為Visual Studio 2019
寫法如下

                MDbgEngine mdbgEngine = new MDbgEngine();
                MDbgProcess mdbgProcess = mdbgEngine.Attach(revitProcess[0].Id, revitProcess[0].MainModule.FileVersionInfo.FileVersion);
                foreach (CorAppDomain appDomain in mdbgProcess.AppDomains)
                {
                    foreach (CorAssembly assembly in appDomain.Assemblies)
                    {
                        MessageBox.Show(assembly.Name);
                    }
                }


但是,這行卻發生錯誤:
System.Runtime.InteropServices.COMException: 'Failed to load the runtime. (Exception from HRESULT: 0x80131700)'
MDbgProcess mdbgProcess = mdbgEngine.Attach(revitProcess[0].Id, revitProcess[0].MainModule.FileVersionInfo.FileVersion);


上網查了資料後說是.NET Framework安裝上的問題。
我的Framework是.NET.Framework4.6.1,我也檢查過了,安裝上沒有什麼問題,我不知道問題出在哪。
我查了很多關於MdbgEngine的資料,相關說明並不多,所有也有考慮要不要使用其他方法。
其實就如題,我只要能獲取一個進程的所有dll,不一定要針對我的問題來回答。
請問各位大大有什麼問題解決方法或是其他建議嗎?
誰是誰
Appdomain.CurrentDomain.GetAssemblies()

注意 : 只會取得 "已被載入的assembly",載入 Assembly 是執行時期的行為,加入參考不見得被載入。
耶露
你好,誰是誰
Appdomain.CurrentDomain.GetAssemblies()確實能得到我想要抓取的東西,但是這僅限於寫在該應用程式底下執行才有用。
也就是說,我想在A應用程式去檢查B應用程式的dll,而不是直接在B底下做。
耶露
步驟一
下載CLR Managed Debugger連結

步驟二
在Visual Studio建立一個主控台應用程式(.NET Framework)

步驟三
從下載的CLR Managed Debugger專案中,找到mdbgeng.dll,corapi.dll,NativeDebugWrappers.dll,把這三個dll參考至主控台應用程式的專案

步驟四
在Program.cs寫入以下程式
        public static void Main(string[] args)
        {
            MDbgEngine mdbgEngine = new MDbgEngine();
            MDbgProcess mdbgProcess = mdbgEngine.Attach(int.Parse(args[0].ToString()), null, RuntimeEnvironment.GetSystemVersion());
            Console.WriteLine("Waiting");
            //接收信號
            mdbgProcess.Go().WaitOne();
            Console.WriteLine("Success!");
            try
            {
                foreach (MDbgModule module in mdbgEngine.Processes.Active.Modules)
                {
                    //判斷是否已經載入
                    if (module.SymReader != null)
                    {
                        Console.WriteLine(Path.GetFileName(module.CorModule.Name));
                        //脫離進程,以免連同應用程式一同關閉
                        mdbgProcess.Detach();
                        Environment.Exit(1);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            //脫離進程,以免連同應用程式一同關閉
            mdbgProcess.Detach();
            Environment.Exit(0);
        }


完成步驟後,需要注意幾點。
程式中的參數(args),就是該應用程式的進程ID(PID),可以在工作管理員的詳細資料看到,在程式中可以使用Process抓取。
然後我的目的是只要有抓到一個載入應用程式的dll就好,所以馬上將做回傳並關閉。1是有抓到,0是沒抓到。
如果想看所有載入的dll,只要改成如下即可
        public static void Main(string[] args)
        {
            MDbgEngine mdbgEngine = new MDbgEngine();
            MDbgProcess mdbgProcess = mdbgEngine.Attach(int.Parse(args[0].ToString()), null, RuntimeEnvironment.GetSystemVersion());
            Console.WriteLine("Waiting");
            //接收信號
            mdbgProcess.Go().WaitOne();
            Console.WriteLine("Success!");
            try
            {
                foreach (MDbgModule module in mdbgEngine.Processes.Active.Modules)
                {
                    Console.WriteLine(Path.GetFileName(module.CorModule.Name));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
            //脫離進程,以免連同應用程式一同關閉
            mdbgProcess.Detach();
            Environment.Exit(0);
        }

回到頂部