C# - 提取应用程序的clr.dll等

时间:2016-10-04 08:15:01

标签: c# .net dll clr

我正在尝试从另一个用C#编写的软件中提取应用程序中的clr.dll和mscorwks.dll。我的目的是收集内存转储分析所需的所有文件,即使要在离线机器上进行分析。

我现在尝试的是;

var currentAssembly = Assembly.LoadFrom(process.MainModule.FileName);//with the given process;
var assemblyList = currentAssembly.GetReferencedAssemblies().ToList();
var manifestList = currentAssembly.GetManifestResourceNames();

虽然GetReferencedAssemblies()没有给我clr.dll或mscorwks.dll,但只有mscorlib.dll和GetManifestResourceNames()只给我一个软件中使用的图像文件。

有没有人有过这样的经历?我错过了一些东西来获取我想要的DLL吗?

感谢您的关注!

此致

ERDI

1 个答案:

答案 0 :(得分:0)

我想实现你想要做的最好的方法是使用Microsoft.Diagnostics.Runtime(nuget-package)和DataTarget类。这使您可以附加到流程并阅读流程中的任何内容。

对于迭代所有已加载的模块(托管和非托管模块),您可以执行以下操作:

    using (dt = DataTarget.AttachToProcess(proc.Id, 100, AttachFlag.Passive))
    {
        // since 4.0 we can possibly find more than one runtime (side-by-side CLRs) in one AppDomain...
        if (dt.ClrVersions.Count > 0)
        {
            foreach (var clr in dt.ClrVersions)
            {
                Console.WriteLine(clr.Version + " " + clr.Flavor.ToString());
            }
        }
    }

其中procSystem.Diagnostics.Process的实例。 您可以枚举所有模块(通过调用ClrVersions

,而不是通过EnumerateModules使用快捷方式