【问题标题】:Using System.Diagnostics.Process to reflect on referenced assemblies?使用 System.Diagnostics.Process 来反映引用的程序集?
【发布时间】:2012-10-26 18:38:59
【问题描述】:

我有一个可执行文件,比如 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(?)

但是,我不知道该怎么做。这可能吗?如果可以,怎么做?谢谢!

【问题讨论】:

  • 如果 exe 或 dll 的分发器没有将依赖项放置在与调用它们的文件相同的位置或 GAC 中,则应用程序可能会从编码的指定位置动态加载它们dll 或 exe 使用 Assembly Resolve...如果是这种情况,我怀疑您是否会通过反射找到位置...
  • 没错,唐,有一段代码可以捕获未找到程序集的异常(不确定它的确切名称)并引用文本文件来查找特定位置。我不想做的是依赖这个文本文件。在这种情况下不可能吗?
  • 不,我没有,让我看看。谢谢!

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


【解决方案1】:

所以事实证明这可以通过 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 等中)

但是,当可执行文件完成加载所有模块时,我无法弄清楚如何“检测”。如果我删除 sleep 行,我只会看到部分模块列表,我猜这些是由 time process.Modules 完成加载的模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    相关资源
    最近更新 更多