【.Net】获取程序集地址

概述:获取不同 AppDomain 下 Assembly 的地址

方法一 ProcessModuleCollection

代码

1
2
3
4
5
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,某些场景下很好用。

代码

1
2
3
4
5
6
7
8
9
10
11
12
// 获取 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")}");

}

【.Net】获取程序集地址
https://hodlyounger.github.io/2024/09/23/B_Code/CSharp/【.Net】获取程序集地址/
作者
mingming
发布于
2024年9月23日
许可协议