.NET 程序集和 DLL rebase

标签 .net assemblies rebasing base-address

根据this article由于代码的 JIT 编译,.NET 程序集不需要 rebase 。文章指出:

“JIT 编译的代码不存在 rebase 问题,因为地址是在运行时根据代码在内存中的放置位置生成的。此外,MSIL 很少受到基地址缺失的影响,因为 MSIL 引用是 token 基于,而不是基于地址。因此,当使用 JIT 编译器时,系统对基地址冲突具有弹性。”

但是,我注意到 VS2008 为所有程序集分配默认的 0x0400000 基地址(项目属性 > 构建 > 高级),并且如果我为我的进程执行 listdlls/r ,则我的所有 .NET 程序集事实上,默认情况下是重新设定的。

如果我自己分配地址,则不会完成 rebase 。

我的问题是:在这种情况下,什么是 rebase 的?为什么?

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

最佳答案

CLR 加载机制在幕后使用 LoadLibrary,因此您会看到以下情况:无法在同一地址加载 2 个程序集。现在,当人们尝试对 dll 进行 rebase 时,通常的意思是避免出现性能问题。修复的命中,例如绝对地址和函数调用需要使用加载的基地址“重新定位”。 CLR 没有这个问题(不确定应用程序中的静态数据,这是这些修复的第二部分,我需要阅读这一点),因为 MSIL 代码是在调用函数时按需加载的在托管代码中。然后,MSIL 被抖动并放置在堆上,我认为这与普通对象堆不同,与 CLR 在应用程序中分配和布置新对象的方式相同。

关于.NET 程序集和 DLL rebase ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/352519/

相关文章:

.net - 有没有办法在不使用 "fff"的情况下在 DateTime 上调用 .ToString() 时显示毫秒?

.net - PowerShell-由.NET对象反序列化时枚举键值对

c# - Visual Studio 2010 程序集引用问题

c# - 两个不同的程序集版本 "The located assembly' 的 list 定义与程序集引用不匹配”

.net - fsi.exe 程序集 : Anyone know how to embed it?

git - 如果两个分支的最终快照相同但提交路径不同,它们是否相同?

.net - NServiceBus:找不到(消息)的元数据

c# - 正则表达式包括结果中应该是非捕获组的内容

.net - 如何衡量在 NGen 之前正确地重新设置 .NET 程序集的效果?