c# - DLL基地址

标签 c# .net dll ngen rebasing

我有一个小型测试解决方案,其中包含一个 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/

相关文章:

c# - MVVM:将单选按钮绑定(bind)到 View 模型?

c# - 是否存在与 ObsoleteAttribute 实际上相反的属性?

.net - 用于删除尾随零的正则表达式

c# - 创建 RunSpace 时如何使用 PowerShell 2 或 3?

c - 避免蒙特卡罗模拟中的基本 rand() 偏差?

c# - WPF 在列表框中拖放,带有拖放位置的预览阴影

执行给定方法的 C# 方法

c# - 什么是避免使用大量参数的方法的好设计?

c++ - 关于 .lib 文件、.dll 文件、后期绑定(bind)、嵌入式应用程序的基本问题?

c++ - Opencv 应用程序在运行时崩溃,错误代码为 0x0000142