概述:获取不同 AppDomain 下 Assembly 的地址
方法一 ProcessModuleCollection
代码
ProcessModuleCollection modules = Process.GetCurrentProcess().Modules;
foreach (ProcessModule pm in modules)
{
Debug.WriteLine($"Module '{pm.ModuleName}' load address: {pm.BaseAddress.ToString("X")}");
}说明
警告
不适用于查询多个 AppDomain 的情况
ProcessModuleCollection 结构体可以通过 GetCurrentProcess 接口获取,该接口获取到的程序集地址为 PE 实际加载的 DLL 文件的地址。这就导致不管是在哪个 AppDomain 内执行,获取到的地址都是相同的。除非 AppDomain 使用 CLR 版本不同。
方法二 RunTimeHelper. m_pData
实测有效,不同 AppDomain 下加载的程序集都可以获取到正确的地址
参考来源
可以看下这个目录下的其他文件,如 MethodHelper、MemoryHelper,某些场景下很好用。
代码
// 获取 AppDomain 内的所有 Assembly
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
// 获取 Assembly 的 m_pData
foreach (var assembly in assemblies)
{
Module module = assembly.ManifestModule;
IntPtr m_pDataValue = ModuleHelper.GetAddressFromModule(module);
Natives.OutputDebug($"Module:{module.Name} m_pData: 0x{m_pDataValue.ToInt64().ToString("x")}");
}