程序设计方法学-micro usb接口

无效的windows映像
2023年4月4日发(作者:windows 2008 r2)

本机映像生成器()

本机映像生成器()

━━━━━━━━━━━━━━━━━━━━━━━━━━

.NETFramework工具

本机映像生成器()

本机映像生成器()是一个提高托管应用程序性能的工具。

创建本机映像(包含经编译的特定于处理器的机器代码的文

件),并将它们安装到本地计算机上的本机映像缓存中。运行库可从

缓存中使用本机映像,而不是使用实时(JIT)编译器编译原始程序集。

在.NETFramework2.0版中,有了很大变化:

安装程序集时还将安装其依赖项,从而简化了的语法。

现在可以在应用程序域之间共享本机映像。

可利用新增操作update重新创建已经失效的映像。

操作可由计算机上使用空闲时间生成和安装映像的服务推迟执行。

消除了一些导致映像无效的因素。

有关如何使用和本机映像服务的其他信息,请参见本

机映像服务。

注意

在本机映像生成器()旧式语法中可以找到.NET

Framework1.0和1.1版的语法。

ngen[options]

ngen/?|/help

操作

下表说明了每个操作的语法。有关actionArguments各部分的说

明,请参见参数、方案和配置表。选项表描述了options和帮助开关。

操作说明

install[assemblyName|assemblyPath][scenarios][config]

[/queue[:{1|2|3}]]

生成程序集及其依赖项的本机映像,并在本机映像缓存中安装这

些映像。

如果指定了/queue,则操作将排队等待本机映像服务。默认优先

级是3。

uninstall[assemblyName|assemblyPath|*][scenarios]

[config]

将程序集及其依赖项的本机映像从本机映像缓存中删除。

若要卸载单个映像及其依赖项,可使用与安装此映像时相同的命

令行参数。

update[/queue]

更新已无效的本机映像。

如果指定了/queue,则更新将排队以等待本机映像服务。更新的

优先级总是预先设定为3,因此它们在计算机空闲时运行。

display[assemblyName|assemblyPath]

显示程序集及其依赖项的本机映像的状态。

如果未提供参数,则显示本机映像缓存中的所有内容。

executeQueuedItems[1|2|3]

执行排队的编译作业。

如果指定了优先级,则执行具有较高或同等优先级的编译作业。

如果未指定优先级,则执行所有排队的编译作业。

queue{pause|continue|status}

暂停本机映像服务,允许暂停的服务继续,或查询服务状态。

参数

参数说明

assemblyName

程序集的名称。可提供程序集的部分名称(如myAssembly),

也可提供完整的显示名称(如myAssembly,Version=2.0.0.0,

Culture=neutral,PublicKeyToken=0038abc9deabfle5)。

每个命令行只能指定一个程序集。

assemblyPath

程序集的显式路径。可指定完整路径或相对路径。

如果指定文件名而不指定路径,则程序集必须位于当前目录中。

每个命令行只能指定一个程序集。

方案

方案说明

/Debug

生成可在调试器下使用的本机映像。

/Profile

生成可在探查器下使用的本机映像。

/NoDependencies

生成指定方案选项所需的最小数目的本机映像。

配置

配置说明

/ExeConfig:exePath

使用指定的可执行程序集的配置。

绑定到依赖项时,需要作出与加载程序相同的决策。如

果在运行时使用Load方法加载共享组件,应用程序的配置文件决定

了为该共享组件加载的依赖项,例如,所加载依赖项的版本。

/ExeConfig开关就运行时将加载哪些依赖项向给出指导。

/AppBase:directoryPath

查找依赖项时,使用指定目录作为应用程序基础。

选项

选项说明

/nologo

禁止显示Microsoft启动版权标志。

/silent

禁止显示成功消息。

/verbose

显示详细的调试信息。

注意

由于操作系统限制,此选项显示的附加信息比在Windows98和

WindowsMillenniumEdition上显示的少。

/help,/?

显示当前版本的命令语法和选项。

备注

若要运行,您必须具有管理特权。

为指定程序集及其所有依赖项生成本机映像。依赖项是

根据程序集清单中的引用来确定的。仅当应用程序使用反射(例如通

过调用方法)来加载依赖项的情

况下才需要单独安装依赖项。

要点

不要将om方法用于本机映

像。使用此方法加载的映像不能由执行上下文中的其他程序集使用。

维护着一个与依赖项有关的计数。例如,假设本机映像

缓存中同时安装了和,而且它

们都具有对的引用。如果卸载了

,则不会卸载。只有当

也被卸载时才会将其移除。

如果为全局程序集缓存中的程序集生成本机映像,请指定其显示

名称。请参见me。

生成的本机映像可以在应用程序域之间共享。这意味着,

在要求在应用程序域之间共享程序集的应用程序方案中可以使用

。若要指定域非特定性:

将LoaderOptimizationAttribute属性应用于应用程序。

为新的应用程序域创建安装信息时,设置

Optimization属性。

将同一个程序集加载到多个应用程序域中时,总是使用非特定于

域的代码。如果本机映像在已加载到共享域之后又被加载到非共享的

应用程序域中,则该映像将无法使用。

注意

非特定于域的代码无法卸载,并且性能可能会稍微降低,尤其是

在访问静态成员时。

为不同的方案生成映像

在您生成一个程序集的本机映像后,每当运行库运行该程序集时,

都会自动尝试找到并使用该本机映像。根据使用方案的不同,可生成

多个映像。

例如,如果您在调试或分析方案中运行程序集,则运行库将查找

利用/Debug或/Profile选项生成的本机映像。如果运行库无法找到

匹配的本机映像,它将恢复为标准的JIT编译。调试本机映像的唯一方

式是使用/Debug选项创建本机映像。

uninstall操作也能识别方案,因此您可以卸载所有方案或只卸载

选择的方案。

确定何时使用本机映像

本机映像可从两方面提高性能:改善内存使用情况和减少启动时

间。

注意

本机映像的性能取决于很多因素,这些因素使得分析难以进行,

如代码和数据访问模式,有多少调用跨模块边界进行,以及多少依赖

项已由其他应用程序加载。确定本机映像是否对应用程序有利的唯一

方式是在关键部署方案中仔细进行性能测量。

改善内存使用情况

当代码在进程间共享时,本机映像可显著改善内存使用情况。本

机映像为WindowsPE文件,因此一个.dll文件的单个副本可由多个

进程共享;而JIT编译器生成的本机代码存储在私有内存中,并且不可

共享。

运行于终端服务下的应用程序也可从共享代码页中获益。

此外,不加载JIT编译器会为每个应用程序实例节省固定量的内存。

更快的应用程序启动速度

使用预编译程序集可减少某些应用程序的启动时间。

通常,如果应用程序共享组件程序集,则可从中获益,因为在第一个

应用程序启动之后,共享组件即已加载,可供后续应用程序使用。而

冷启动(应用程序中的所有程序集必须从硬盘上加载)则不会从本机

映像中获得相同的益处,因为硬盘访问时间占了很大比重。

硬绑定可影响启动时间,因为硬绑定至主应用程序程序集的所有

映像必须同时加载。

注意

如果您有强命名的共享组件,则请将它们放置在全局程序集缓存

中。加载程序对未处于全局程序集缓存中的强命名程序集执行额外验

证,实际抵消了使用本机映像在启动时间方面获得的任何改善。

程序集基址的重要性

因为本机映像为WindowsPE文件,所以它们和其他可执行文件

一样有着相同的重定基址问题。如果采用硬绑定,则重定位的性能开

销甚至更显著。

若要设置本机映像的基址,请使用编译器的相应选项设置程序集

的基址。对本机映像使用此基址。

注意

本机映像大于创建它时所基于的托管程序集。基址必须进行计算

以允许使用这些更大的大小。

可使用之类的工具查看本机映像的首选基址。

使用注意事项摘要

下面的常规注意事项和应用程序注意事项可能有助于您决定是否

对应用程序本机映像进行评估:

本机映像的加载速度比MSIL更快,因为本机映像不必执行很多

启动操作,如JIT编译和类型安全验证。

本机映像需要较小的初始工作集,因为它不需要JIT编译器。

本机映像允许在进程间共享代码。

本机映像需要占用比MSIL程序集更大的硬盘空间,并且可能需

要相当长的时间才能生成。

必须维护本机映像。

在提供原始程序集或原始程序集的某个依赖项后,需要重新生成

映像。

一个程序集可能需要多个本机映像,分别用在不同应用程序或不

同方案中。例如,两个应用程序中的配置信息可能为同一个依赖程序

集生成不同的绑定方案。

必须由管理员(也就是从Administrators组中的某个Windows

帐户)来生成本机映像。

除了这些常规注意事项之外,在确定本机映像是否可提供性能益

处时,必须考虑应用程序的性质:

如果应用程序运行于使用很多共享组件的环境中,本机映像允许

多个进程共享组件。

如果应用程序使用多个应用程序域,本机映像允许跨域共享代码

页。

注意

在.NETFramework1.0和1.1版中,本机映像不能跨应用程序

域共享。而在2.0版中则可以。

如果应用程序将在终端服务器下运行,本机映像允许共享代码页。

编译为本机映像通常有利于大型应用程序。小型应用程序通常不

会获益。

对于长时间运行的应用程序,运行时JIT编译的性能略高于本机映

像。(硬绑定某种程度上可减少这一性能差别。)

硬绑定

硬绑定增加吞吐量并减少本机映像的工作集大小。硬绑定的缺点

是硬绑定到程序集的所有映像在加载程序集时必须都加载。对于大型

应用程序,这会大大增加启动时间。

硬绑定适合于在所有应用程序性能关键的方案中加载的依赖项。

与本机映像使用情况的任何方面一样,仔细测量性能是确定硬绑定是

否可改善应用程序性能的唯一方式。

DependencyAttribute和DefaultDependencyAttribute属性可

使您向提供硬绑定提示。

注意

这些属性是对的提示,而不是命令。使用这些提示不

保证进行硬绑定。这些属性的含义在将来的版本中可能会更改。

为依赖项指定绑定提示

将DependencyAttribute应用于程序集可指示加载指定依赖项的

可能性。指示

适合进行硬绑定,Default指示应使用依赖项的默认提示,而

Sometimes则指示不适合使用硬绑定。

下面的代码显示有两个依赖项的程序集的属性。第一个依赖项

(Assembly1)适合于进行硬绑定,而第二个(Assembly2)不适合进行

硬绑定。

VisualBasic

复制代码

erServices

)>

mes)>

C

#复制代码

erServices;

[assembly:DependencyAttribute("Assembly1",

)]

[assembly:DependencyAttribute("Assembly2",

mes)]

C++

复制代码

usingnamespaceSystem::Runtime::CompilerServices;

[assembly:DependencyAttribute("Assembly1",

)];

[assembly:DependencyAttribute("Assembly2",

mes)];

程序集名称不包括文件扩展名。可使用显示名称。

为程序集指定默认绑定提示

只有某些程序集需要默认绑定提示:这些程序集将由依赖于它们

的任何应用程序直接并经常使用。以

DefaultDependencyAttribute应用于这样的程序集可指定应使用硬

绑定。

注意

不应将DefaultDependencyAttribute应用于不属于此类别

的.dll程序集,因为以

之外的其他值

应用该属性的效果与根本不应用该属性相同。

Microsoft使用DefaultDependencyAttribute指定硬绑定

为.NETFramework中极少数程序集(如)的默认绑定。

疑难解答

若要确认应用程序正在使用本机映像,可使用程序集绑定日志查

看器()。在绑定日志查看器窗口上,选择“日志类别”

框中的“本机映像”。提供了有关为什么拒绝本机映像

的信息。

可使用JitCompilationStart托管调试助手(MDA)确定JIT编译

器何时开始编译函数。

推迟处理

超大型应用程序的本机映像生成过程可能需要相当长的时间。同

样,更改共享组件或更改计算机设置可能需要更新很多本机映像。

install和update操作有一个/queue选项,该选项将该操作排入队

列,以由本机映像服务推迟执行。此外,具有queue和

executeQueuedItems操作,这些操作提供了对本机映像服务的某些

控制。有关更多信息,请参见本机映像服务。

本机映像和JIT编译

如果在程序集中遇到它无法生成的任何方法,则它会

将这些方法从本机映像中排除。当运行库执行此程序集时,对于那些

不包括在本机映像中的方法,它将恢复为JIT编译。

此外,如果程序集已更新,或者本机映像出于任何原因已失效,

则不会使用本机映像。

无效映像

当您使用创建程序集的本机映像时,输出取决于您指

定的命令行选项以及计算机上的某些设置。这些设置包括:

.NETFramework的版本。

操作系统的版本(在从Windows9x系列更改为WindowsNT系

列的情况下)。

程序集的确切标识(重新编译将更改标识)。

程序集引用的所有程序集的确切标识(重新编译将更改标识)。

安全因素。

在生成本机映像时记录这些信息。当您执行程序集时,

运行库将查找用匹配计算机的当前环境的选项和设置生成的本机映像。

如果运行库没有找到匹配的本机映像,它将恢复为程序集的JIT编译。

对计算机的设置和环境进行以下更改会导致本机映像失效:

.NETFramework的版本。

如果将更新应用于.NETFramework,则使用创建的

所有本机映像都将失效。因此,.NETFramework的所有更新都执行

NgenUpdate命令,以确保重新生成所有的本机映像。.NET

Framework为它安装的.NETFramework库自动创建新的本机映像。

操作系统的版本(在从Windows9x系列更改为WindowsNT系

列的情况下)。

例如,如果计算机上运行的操作系统的版本从Windows98更改

为WindowsXP,则存储在本机映像缓存中的所有本机映像都将失效。

但是,如果将操作系统从Windows2000更改为WindowsXP,则这

些映像将不会失效。

程序集的确切标识。

如果重新编译程序集,则程序集的相应本机映像将失效。

程序集引用的任何程序集的确切标识。

如果更新一个托管程序集,则所有直接或间接依赖该程序集的本

机映像都将失效,并需要重新生成。这既包括一般引用,也包括硬绑

定依赖项。每当应用软件更新,安装程序就应执行NgenUpdate命

令,以确保重新生成所有依赖的本机映像。

安全因素。

更改计算机安全策略以限制先前授予某个程序集的权限,这样会

导致该程序集的先前编译的本机映像失效。

有关公共语言运行库如何管理代码访问安全以及如何使用权限的

详细信息,请参见代码访问安全性

示例

下面的命令为当前目录中的生成本机映像,并在

本机映像缓存中安装该映像。如果该程序集存在配置文件,

将使用它。此外,还会为所引用的任何.dll文件生成

本机映像。

使用安装的映像也称为根。根可以为应用程序或共享

组件。

下面的命令生成具有指定路径的的本机映像。

ngeninstallc:

当查找程序集及其依赖项时,使用与公共语言运行库所

使用的相同的探查逻辑。默认情况下,包含的目录用

作应用程序基目录,所有程序集的探查均从此目录开始。使用

/AppBase选项可重写此行为。

注意

这是对.NETFramework1.0和1.1版中的行为的更

改,在这些版本中,应用程序基目录设置为当前目录。

程序集可以具有不带引用的依赖项(例如,它使用

方法加载.dll文件)。您可以使

用/ExeConfig,使用应用程序程序集的配置信息来为这样的.dll文件

创建本机映像。下面的命令使用的配置信息为,

生成一个本机映像。

ngeninstallc:

/ExeConfig:c:

在移除应用程序时将不移除以此方式安装的程序集。

若要卸载依赖项,请使用与安装时相同的命令行选项。下面的命

令卸载上面示例中的。

ngenuninstallc:

/ExeConfig:c:

若要在全局程序集缓存中为程序集创建本机映像,请使用程序集

的显示名称。例如:

ngeninstall"ClientApp,Version=1.0.0.0,Culture=neutral,

PublicKeyToken=3c7ba247adcd2081,

processorArchitecture=MSIL"

会为您安装的每个方案生成一个单独的映像集。例如,

下面的命令为正常操作生成一个完整的本机映像集,为调试生成另一

个完整的映像集,并为探测生成第三个映像集:

/debug

/profile

显示本机映像缓存

在缓存中安装本机映像后,就可使用显示这些映像。

下面的命令显示本机映像缓存中的所有本机映像。

ngendisplay

display操作首先列出所有的根程序集,然后列出计算机上的所有

本机映像。

使用程序集的简单名称仅显示该程序集的信息。下面的命令显示

本机映像缓存中与部分名称MyAssembly匹配的所有本机映像、其依

赖项以及所有依赖MyAssembly的根:

ngendisplayMyAssembly

了解哪些根依赖于共享组件程序集对于在共享组件升级后确定

update操作的影响非常有用。

如果指定了程序集的文件扩展名,则必须指定路径,或从包含该

程序集的目录执行:

ngendisplayc:

下面的命令显示本机映像缓存中名为MyAssembly、版本为

1.0.0.0的所有本机映像。

ngendisplay"myAssembly,version=1.0.0.0"

更新映像

映像通常是在共享组件更新之后进行更新的。若要更新本身发生

更改或者其依赖项发生了更改的所有本机映像,请不带任何参数使用

update操作。

ngenupdate

更新所有映像可能会耗费很长时间。使用/queue选项可对更新

操作进行排队以等候本机映像服务执行。有关/queue选项和安装优

先级的更多信息,请参见本机映像服务。

ngenupdate/queue

卸载映像

维护依赖项的列表,所以,只有当依赖于这些共享组件

的所有程序集都被移除后,才会移除这些共享组件。此外,已安装为

根的共享组件不会被移除。

下面的命令卸载根的所有方案:

ngenuninstallClientApp

uninstall操作可用于移除特定方案。下面的命令卸载

的所有调试方案:

ngenuninstallClientApp/debug

注意

卸载/debug方案不会卸载同时包含/profile和/debug.的方案

下面的命令卸载特定版本的的所有方案:

ngenuninstall"ClientApp,Version=1.0.0.0"

下面的命令卸载"ClientApp,Version=1.0.0.0,Culture=neutral,

PublicKeyToken=3c7ba247adcd2081,

processorArchitecture=MSIL",的所有方案,或者只卸载该程序集的

调试方案:

ngenuninstall"ClientApp,Version=1.0.0.0,Culture=neutral,

PublicKeyToken=3c7ba247adcd2081,

processorArchitecture=MSIL"

ngenuninstall"ClientApp,Version=1.0.0.0,Culture=neutral,

PublicKeyToken=3c7ba247adcd2081,

processorArchitecture=MSIL"/debug

与install操作一样,如果提供了扩展名,则需要从包含该程序集

的目录执行,或者指定完整路径。

有关本机映像服务的示例,请参见本机映像服务。

更多推荐

无效的windows映像