根据this article由于JIT编译代码,.NET程序集不需要重新定位。文章指出:
“JIT编译的代码没有重定位问题,因为地址是在运行时根据代码放置在内存中的位置生成的。此外,MSIL很少受到基地址未命中的影响,因为MSIL引用是令牌因此,当使用JIT编译器时,系统对基地址冲突具有弹性。“
但是,我注意到VS2008为所有程序集分配了默认的0x0400000基地址(项目属性> build> advanced),如果我为我的进程执行了listdlls /r
,那么我的所有.NET程序集实际上都是默认情况下重新定位。
如果我自己分配地址,则不会进行变基。
我的问题是:在这种情况下,什么是重新定义的?为什么?
编辑:我应该补充一点,我不是在谈论NGen'ed集会。答案 0 :(得分:3)
CLR加载机制在后台使用LoadLibrary,因此您观察到:2个程序集无法在同一地址加载。现在人们在试图改变一个dll时通常意味着避免这种情况。修复过程,例如绝对地址&函数调用需要与加载的基地址“重定位”。 CLR没有这个问题(不确定应用程序中的静态数据,这是这些修复的第二部分,我需要阅读这个),因为当你调用一个函数时按需加载MSIL代码在托管代码中。然后MSIL进行jitted并放置在堆上,与我认为的普通对象堆不同,就像CLR在应用程序中分配和布置新对象一样。
答案 1 :(得分:1)
你在运行什么操作系统?我知道远景和远程引入了ASLR,它随机化了它加载dll的地址空间。这种情况发生在系统dll但不确定.net - 可能需要考虑的事情。