问题标签 [ngen]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - 验证 .NET Framework 程序集
我刚刚浏览了我们的德国 VB.NET 论坛,有一些有趣的事情让我有些头疼。
实际上可以使用 ReflexIL 或其他一些 IL 编辑器来编辑.NET Framework 程序集。您唯一需要绕过的是程序集的强名称签名。更改程序集 IL 后,您必须运行sn.exe -Vr [assemblyname]
以跳过强名称验证。之后,您必须清除缓存的本机图像。只需浏览C:\Windows\assembly
目录并删除与您的程序集相关的每个图像。然后重新启动。登录后,运行ngen install [assemblyname]
. 现在生成了新的本机图像。
这行得通。我在我的虚拟环境(Windows XP x86)中验证了这个过程。现在最让我担心的是你可以轻松绕过.NETVerifyHash
或. 这实际上也有效。我和我的一个朋友经过测试可以验证这个问题(见截图)。那相当容易。VerifyData
RSACryptoServiceProvider
例如,如果我要创建一个基于 .NET Framework 加密类的许可系统,那么对于使用该框架的系统上的每个 .NET 应用程序,都可以在系统范围内绕过它。此外,每个人都可以通过挂钩方法来记录和更改我调用的函数的输入。
现在我的问题是:既然这可能是一个大问题,我该怎么做呢?当然,恶意用户可以只编辑我的应用程序,但这不会像在系统范围内那样糟糕。我在考虑一些框架校验和验证,但由于 .NET 框架有很多不同的更新,这似乎是不可能的。
有什么解决方案或建议吗?微软是否以某种方式解决了这个问题?
.net - 跨程序集的本机映像内联方法
正如另一个问题中所解释的,如果方法具有TargetedPachingOptOutAttribute集,则通常只允许 Ngen 跨程序集内联方法。
但是,通过使用DependencyAttribute对硬绑定程序集也是如此吗?LoadHint.Always
编辑:也许我最初的问题的答案是否定的,否则TargetedPatchingOptOutAttribute
在 mscorlib 中使用它是没有意义的,因为这个程序集总是硬绑定的(它具有DefaultDependencyAttribute集)。所以我想重新提出我的问题:在TargetedPatchingOptOutAttribute
程序集的本机图像中内联方法是唯一的方法吗?
.net - Ngen 硬绑定(DependencyAttribute)用法
一些上下文
安装我的应用程序后,安装程序会为其部署的所有程序集调用 Ngen。这样做是为了减少启动时间,并且效果很好(它在我的机器上将时间从大约 22 秒减少到大约 14 秒)。它是一个 .NET 4.0 x86 WPF 应用程序,使用大约 40 个程序集(其中大部分是第三方的),所有程序集的大小约为 45 MB。
我现在将一些DependencyAttributes应用于我的代码以启用硬绑定(MSDN 中的解释)。这样做的原因是在启动期间已经加载了一些第三方程序集,否则在用户打开第一个数据输入窗口之前不会加载这些程序集。是的,我知道这会减慢我的应用程序的启动时间,但如果它减少了打开第一个数据输入窗口所需的时间,那就没问题了。
问题
1) 有什么方法可以检查加载的本机图像是作为硬绑定还是普通/软绑定加载的?
2)(如果第一个问题的答案是肯定的,我可以自己检查一下。)如果我有定义的 AssemblyA 和定义的[assembly: Dependency("AssemblyB", LoadHint.Always)]
AssemblyB,[assembly: Dependency("AssemblyC", LoadHint.Always)]
加载 AssemblyA 还会加载带有硬绑定的 AssemblyC(假设所有三个都有有效的本机图像) ? 还是我需要为所有依赖程序集指定直接硬依赖项?因为如果我这样做,ngen display /verbose
那些间接依赖不会被列为直接硬依赖,而只是作为依赖的硬依赖。
3)我刚刚发现,如果该程序集未直接在我的程序集中使用,则我无法将程序集定义为硬依赖项(消息来自ngen install /verbose
:警告:无法硬绑定到 ThirdPartyAssemblyB,因为它未加载)。所以我的项目引用了ThirdPartyAssemblyA 和ThirdPartyAssemblyB,但没有使用ThirdPartyAssemblyB 中的任何类。但是在运行时仍然需要 ThirdPartyAssemblyB,因为 ThirdPartyAssemblyA 使用它。使用 .NET Reflector 我可以看到编译器删除了我对 ThirdPartyAssemblyB 的引用。并使用ngen display /verbose
我可以看到我的程序集没有直接依赖于 ThirdPartyAssemblyB,既不是硬的也不是软的。当然,它仍然对 ThirdPartyAssemblyA 有间接依赖(这是一个硬依赖),但由于 ThirdPartyAssemblyA 对 ThirdPartyAssemblyB 没有硬依赖,这无济于事。我真的需要创建一些直接引用 ThirdPartyAssemblyB 的虚拟代码来获得硬绑定吗?
4)由于某种原因ngen install MyAssembly /verbose
打印以下警告:“警告:无法硬绑定到 PresentationFramework,版本 = 4.0.0.0,文化 = 中性,PublicKeyToken = 31bf3856ad364e35,因为依赖项没有本机图像(检查 FusLogVw 的原因)”。但是我确实有一个 PresentationFramework 的本机图像,并且使用 Fuslogvw 我可以看到它是在运行时加载的。安装本机图像后,ngen display /verbose
甚至将 PresentationFramework 列为我的程序集的硬依赖项。那么这个警告是什么意思呢?
c# - MethodImplOptions.AggressiveInlining 与 TargetedPatchingOptOut
MethodImplOptions.AggressiveInlining
带有选项的 MethodImplAttribute和之间有什么区别TargetedPatchingOptOut
?
当我在谷歌上搜索时,每个人似乎都说两者(可能)都内联该方法,但没有给出区别。
.net - NGEN 和平台目标是同一个东西吗?
您可以使用 NGEN.EXE 将 MSIL 程序集编译为本机程序集。但是当你有源代码时,你也可以在项目选项中选择“平台目标”。如果我在那里选择 x64,这与在 x64 机器上运行 NGEN.EXE 是一样的吗?
.net - NGen 和通用集合。如何摆脱Jitting?
我正在为 ngen 和通用集合而苦苦挣扎。我已经在解决方案中生成了我的所有程序集,但每次我的应用程序执行该代码时仍然会发生某种抖动:
MDA 信息:
NGen 和通用集合是否存在一些问题?
c# - Ngen 可以用于代码安全吗?
Ngen 可以用作完美的代码混淆器,保护您的 .NET CIL 永远不会到达客户端吗?
我可以在我的开发 PC 上运行 Ngen 并将 exe 发送到每个具有兼容 .NET 框架版本的客户端吗?(假设两者都是 x86 或 x64) Ngen'd exe 跨机器有什么区别?
我知道最新的 Ngen 会生成一个包含 IL + Native 代码的 exe,可以使用 Reflector 之类的东西将其提取并“转换”回源代码。但是,.NET 框架 1.1 的 ngen 去除了生成的 exe 中的 IL,如果您使用 .NET 框架 1.1,则使其成为代码安全性的可能选择。
.net - 在 Intel 机器上为托管程序集生成 ARM 代码
直接关系到这个问题。
给定 Windows Phone 的托管程序集,如何为 ARM CPU 生成本机代码?我没有 Windows/ARM 设备(平板电脑和手机都没有)。那里有ngen
实用程序,但 AFAIK 它只能为主机(即英特尔)生成代码。
我问的原因是,Windows Phone 开发中心提供的崩溃堆栈中的偏移量不是 MSIL 偏移量(我已经检查过 - 它们超出了 MSIL 函数大小)。这些看起来像本机代码偏移量。现在,不能保证离线生成的 ARM 代码与手机上执行的代码完全匹配,但至少会有一些相似之处。
编辑:这个crossgen
工具听起来很像。但我无法让它工作;说file "..." or one of its dependencies was not found
- 文件就在那里,我正在指定 /MissingDependenciesOK 标志。
.net - `*.ni.dll.aux` 文件的格式是什么?
*.ni.dll.aux
中找到的文件的格式(数据布局)是C:\Windows\assembly\NativeImages_v4.0.30319_64
什么?我了解这些是由ngen.exe
. 它们包含哪些数据?
c# - 首次运行时自动运行 Ngen.exe
我的应用没有安装程序。它是可移植的,但我需要ngen.exe
在它上面运行,因为它在启动时运行。
是否建议ngen.exe
在应用程序的第一次运行时自动运行?以后会不会出问题?有内置的方法吗?