问题标签 [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.

0 投票
1 回答
484 浏览

.net - 验证 .NET Framework 程序集

我刚刚浏览了我们的德国 VB.NET 论坛,有一些有趣的事情让我有些头疼。

实际上可以使用 ReflexIL 或其他一些 IL 编辑器来编辑.NET Framework 程序集。您唯一需要绕过的是程序集的强名称签名。更改程序集 IL 后,您必须运行sn.exe -Vr [assemblyname]以跳过强名称验证。之后,您必须清除缓存的本机图像。只需浏览C:\Windows\assembly目录并删除与您的程序集相关的每个图像。然后重新启动。登录后,运行ngen install [assemblyname]. 现在生成了的本机图像。

这行得通。我在我的虚拟环境(Windows XP x86)中验证了这个过程。现在最让我担心的是你可以轻松绕过.NETVerifyHash或. 这实际上也有效。我和我的一个朋友经过测试可以验证这个问题(见截图)。那相当容易。VerifyDataRSACryptoServiceProvider

例如,如果我要创建一个基于 .NET Framework 加密类的许可系统,那么对于使用该框架的系统上的每个 .NET 应用程序,都可以在系统范围绕过它。此外,每个人都可以通过挂钩方法来记录更改我调用的函数的输入。

现在我的问题是:既然这可能是一个大问题,我该怎么做呢?当然,恶意用户可以只编辑我的应用程序,但这不会像在系统范围内那样糟糕。我在考虑一些框架校验和验证,但由于 .NET 框架有很多不同的更新,这似乎是不可能的。

有什么解决方案或建议吗?微软是否以某种方式解决了这个问题?

0 投票
1 回答
3610 浏览

.net - 跨程序集的本机映像内联方法

正如另一个问题中所解释的,如果方法具有TargetedPachingOptOutAttribute集,则通常只允许 Ngen 跨程序集内联方法。

但是,通过使用DependencyAttribute硬绑定程序集也是如此吗?LoadHint.Always

编辑:也许我最初的问题的答案是否定的,否则TargetedPatchingOptOutAttribute在 mscorlib 中使用它是没有意义的,因为这个程序集总是硬绑定的(它具有DefaultDependencyAttribute集)。所以我想重新提出我的问题:在TargetedPatchingOptOutAttribute程序集的本机图像中内联方法是唯一的方法吗?

0 投票
0 回答
961 浏览

.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 列为我的程序集的硬依赖项。那么这个警告是什么意思呢?

0 投票
1 回答
11142 浏览

c# - MethodImplOptions.AggressiveInlining 与 TargetedPatchingOptOut

MethodImplOptions.AggressiveInlining带有选项的 MethodImplAttribute和之间有什么区别TargetedPatchingOptOut

当我在谷歌上搜索时,每个人似乎都说两者(可能)都内联该方法,但没有给出区别。

0 投票
1 回答
181 浏览

.net - NGEN 和平台目标是同一个东西吗?

您可以使用 NGEN.EXE 将 MSIL 程序集编译为本机程序集。但是当你有源代码时,你也可以在项目选项中选择“平台目标”。如果我在那里选择 x64,这与在 x64 机器上运行 NGEN.EXE 是一样的吗?

0 投票
1 回答
361 浏览

.net - NGen 和通用集合。如何摆脱Jitting?

我正在为 ngen 和通用集合而苦苦挣扎。我已经在解决方案中生成了我的所有程序集,但每次我的应用程序执行该代码时仍然会发生某种抖动:

MDA 信息:

NGen 和通用集合是否存在一些问题?

0 投票
1 回答
1114 浏览

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,则使其成为代码安全性的可能选择。

0 投票
1 回答
259 浏览

.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 标志。

0 投票
1 回答
1261 浏览

.net - `*.ni.dll.aux` 文件的格式是什么?

*.ni.dll.aux中找到的文件的格式(数据布局)是C:\Windows\assembly\NativeImages_v4.0.30319_64什么?我了解这些是由ngen.exe. 它们包含哪些数据?

0 投票
2 回答
1829 浏览

c# - 首次运行时自动运行 Ngen.exe

我的应用没有安装程序。它是可移植的,但我需要ngen.exe在它上面运行,因为它在启动时运行。

是否建议ngen.exe在应用程序的第一次运行时自动运行?以后会不会出问题?有内置的方法吗?