我正在尝试从另一个用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
答案 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());
}
}
}
其中proc
是System.Diagnostics.Process
的实例。
您可以枚举所有模块(通过调用ClrVersions
)
EnumerateModules
使用快捷方式