3

如果 Ngen 不保护我的应用程序,我什么时候可以合理地期望在我的职业生涯中使用这个应用程序?

4

3 回答 3

2

Jeffrey Richter 在他的书中写了一篇很棒的文章,我不知道第三个版本是否有它,但这是他在 2002 年的一篇关于 Ngen'ing 的很棒的文章,它仍然具有相关性。

强调:

同时,NGen 文件存在几个潜在问题:

  • 没有知识产权保护。许多人认为,可以在不发送包含原始 IL 代码的文件的情况下发送 NGend 文件,从而将其知识产权保密。不幸的是,这是不可能的。在运行时,CLR 需要访问程序集元数据,而 NGend 文件不包含元数据。

  • NGend 文件可能会失去同步。当 CLR 加载 NGen 文件时,它会比较有关先前编译代码和当前执行环境的许多属性。如果任何属性不匹配,则不能使用 NGen 文件,而是使用正常的 JIT 编译器过程。

  • 管理不善。卸载程序集时不会自动删除 NGen 文件,这会对 .NET Frameworks 轻松管理和 XCOPY 部署故事产生不利影响。

  • 较差的加载时间性能(变基)。当 Windows 加载一个 NGend 文件时,它会检查文件是否在其首选基地址加载。如果文件无法在其首选基地址加载,则 Windows 会重新定位文件,修复所有内存地址引用。这是非常耗时的,因为 Windows 必须将整个文件加载到内存中并修改文件中的各个字节。有关变基的更多信息,请参阅我的书:Programming Applications for Microsoft Windows, 4th Edition (Microsoft Press)。

较差的执行时间性能。

在编译代码时,NGen 无法像 JIT 编译器那样对执行环境做出尽可能多的假设。这会导致 NGen.exe 生成具有许多 JIT 编译代码所不需要的内存引用间接的代码

于 2010-08-28T17:01:21.887 回答
1

NGen 仅用于编译 IL 以提高性能。您可能需要研究代码混淆以保护应用程序免受逆向工程的影响。

于 2010-08-28T17:00:11.730 回答
0

加载速度是它真正有用的全部。也就是说,它可以提高 2000%(是的,这是正确的)。

编辑:

请注意,JIT 代码通常比 NGEN 代码更快。

于 2010-08-28T16:58:02.597 回答