如果 Ngen 不保护我的应用程序,我什么时候可以合理地期望在我的职业生涯中使用这个应用程序?
3 回答
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 编译代码所不需要的内存引用间接的代码
NGen 仅用于编译 IL 以提高性能。您可能需要研究代码混淆以保护应用程序免受逆向工程的影响。
加载速度是它真正有用的全部。也就是说,它可以提高 2000%(是的,这是正确的)。
编辑:
请注意,JIT 代码通常比 NGEN 代码更快。