我有一个小型测试解决方案,其中包含一个 exe 和三个 Dll,exe 各调用三个 Dll 一次。 我已将 Dll1.dll、Dll2.dll 和 Dll3.dll 的Build->Advanced->DLL Base Address设置分别设置为 0x41000000、0x42000000 和 0x43000000。我已经跑了
ngen install ConsoleApplication1.exe
这样就成功生成了应用程序以及三个 Dll。我真的不想生成 exe,但到目前为止,这是产生任何结果的唯一方法。
在运行时,我使用 VMMap 来监视虚拟地址空间,它显示 ngen 的 Dll 位于虚拟内存的一致范围内,但是它们仍然在该范围内跳跃,每次加载到略有不同的地址我运行它们的时候了。 VMMap 显示在我尝试加载图像的地址上没有分配任何内容,因此这种跳跃行为不是由地址冲突引起的。
我一直在保存日志:
Dll1 Dll2 Dll3
0x40140000 0x411D0000 0x42810000
0x40580000 0x41EB0000 0x426B0000
0x40190000 0x41FB0000 0x42380000
0x40F30000 0x41FD0000 0x42050000
0x409B0000 0x41BF0000 0x42910000
0x408E0000 0x41860000 0x42050000
0x40B50000 0x41280000 0x42A80000
请注意,在所有运行中,所有三个 Dll 的地址前两位数字保持一致。
我的实际问题:这是成功的指标吗?我有点困惑,因为我认为 Dll 正好位于 0x41000000、0x42000000 和 0x43000000。结果显示,他们在该区域闲逛,但从未真正坐在我要求他们坐的地方。我的理解是,您希望 Dll 准确地加载到您要求的地址,这样它们就不必经历昂贵的 rebase 操作(当您的 Dll 已被加载时,这是非常非常昂贵的)恩根)。但是,这不正是正在发生的事情吗?当然,我的 Dll 徘徊在某个区域,但它们并不完全位于我要求它们所在的位置,因此每次运行时肯定都会执行昂贵的 rebase 操作吗?这正是我想要避免的。
注意:我对支持/反对 rebase 和 ngen 的争论不感兴趣。我只是想知道发生了什么以及如何让它发挥作用。
干杯!
最佳答案
可能是 ASLR(地址空间布局随机化)- 查看来自 http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/bac7e300-f3df-4087-9c4b-847880d625ad 的链接
关于c# - DLL基地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7395447/