使用System.Diagnostics.Process反映引用的程序集?

时间:2012-10-26 18:39:00

标签: c# .net reflection process .net-assembly

我有一个可执行文件,比如abc.exe,它引用了a.dll(与可执行文件相同的文件夹),b.dll(在随机文件夹中)和c.dll(在随机文件夹中)。

但是,这些DLL不一定与可执行文件(或GAC中)位于同一目录中,这是我无法做任何事情的。

我尝试使用System.Reflection.Assembly来尝试查找abc.exe使用的所有引用程序集。

foreach (AssemblyName an in assembly.GetReferencedAssemblies())
{
    Assembly.Load(an);
}

这似乎加载了可执行文件目录(a.dll)中的程序集,但不会令人惊讶地抛出其他文件未找到的异常。

我的想法是使用System.Diagnostics.Process加载进程然后反思该进程,因为那应该告诉我在哪里可以找到b.dll和c.dll(?)

但是,我不知道如何去做。这是可能的,如果是的话,怎么办呢?谢谢!

1 个答案:

答案 0 :(得分:0)

事实证明,这可以通过System.Diagnostic.Process来完成,例如:

public void findModules(string executablePath)
    {
         Process process = new Process();
         process.StartInfo.FileName = executablePath;
         process.Start();
         process.WaitForInputIdle();
         System.Threading.Thread.Sleep(10000);

         ProcessModuleCollection mods = process.Modules;

         foreach (ProcessModule m in mods)
         {
            Console.WriteLine(m.ModuleName + ":" + m.FileName);
         }
  }

其中ModuleName为您提供程序集的名称,FileName为您提供正确的程序集路径,无论它在何处(在网络上,在C:\ Windows等中)

但是,当可执行文件加载完所有模块时,我无法弄清楚如何'检测'。如果我删除了睡眠行,我只看到一个部分模块列表,我猜这些模块是按时间进程加载完成的。调用模块。