代码之家  ›  专栏  ›  技术社区  ›  Brian Rasmussen

.NET程序集和DLL重定基址

  •  11
  • Brian Rasmussen  · 技术社区  · 17 年前

    this article 由于代码的JIT编译,.NET程序集不需要重定基址。该条规定:

    但是,我注意到VS2008为所有程序集(project properties>build>advanced)分配了默认的0x0400000基址,如果我执行 listdlls /r 对于我的进程,所有.NET程序集实际上都是根据默认值重新设置的。

    我的问题是:在这种情况下,什么是重定基础,为什么?

    编辑:我应该补充一点,我不是在谈论NGen’ed程序集。

    2 回复  |  直到 17 年前
        1
  •  3
  •   liggett78    17 年前

    CLR加载机制在后台使用LoadLibrary,因此您观察到:不能在同一地址加载两个程序集。现在,当人们试图重新设置dll的基础时,通常的意思是避免性能。修复的命中率,例如绝对地址和;函数调用需要使用加载的基址“重新定位”。CLR没有这个问题(不确定应用程序中的静态数据,这是这些修复的第二部分,我需要仔细阅读),因为在托管代码中调用函数时,MSIL代码是按需加载的。然后,MSIL被jitted并放置在堆上,我相信这与普通对象堆不同,CLR在应用程序中分配和布局新对象的方式相同。

        2
  •  1
  •   keithwarren7    17 年前

    你在运行什么操作系统?我知道vista和beyond引入了ASLR,它将加载DLL的地址空间随机化。这种情况发生在系统DLL上,但对.net不太确定-可能需要研究一下。