执行Ngen后,我应该在哪里找到生成的文件?

24
我在一个C#可执行文件上运行了Ngen。它成功了,但我找不到在我的电脑上生成的文件在哪里。MSDN说它应该在本机映像缓存中,但我仍然无法找到它...
编辑:我想在其上运行objdump,因此我需要物理文件。
编辑2:运行ngen时我的输出为:
C:\Documents and Settings\nmea\My Documents\Visual Studio 2008\Projects\Consol
eApplication4\ConsoleApplication4\bin\Release>ngen install ConsoleApplication4.e
xe
Microsoft (R) CLR Native Image Generator - Version 2.0.50727.3053
Copyright (c) Microsoft Corporation.  All rights reserved.
Installing assembly C:\Documents and Settings\nmea\My Documents\Visual Studio
2008\Projects\ConsoleApplication4\ConsoleApplication4\bin\Release\ConsoleApplica
tion4.exe
    Compiling assembly C:\Documents and Settings\nmea\My Documents\Visual Stud
io 2008\Projects\ConsoleApplication4\ConsoleApplication4\bin\Release\ConsoleAppl
ication4.exe (CLR v2.0.50727) ...
ConsoleApplication4, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
5个回答

25

具体位置因版本而异,但大致类似于以下内容:

C:\Windows\assembly\NativeImages_v2.0.50727_32\System.Web\ace3bede2f516f9e5bca620ad86cc063>System.Web.ni.dll
它们位于C:\Windows\assembly,然后每个.NET版本都有一个NativeImages_vXXX的子文件夹。然后为每个具有本地映像的dll创建一个子文件夹。在其下面是唯一版本标识符的另一个子文件夹(因此您可以从同一dll的不同版本中拥有多个本地映像)。最后是本地dll本身。
请注意,在Windows资源管理器中您无法导航到此目录。请使用cmd。在资源管理器中,有一个外壳扩展程序来隐藏GAC和本地映像的详细信息,仅显示给您一个更漂亮的UI。

2
原来你可以在资源管理器中浏览全局程序集缓存(GAC) -- 我已经添加了一个答案,不确定是否更适合作为评论。 - Tim Barrass
Ngen与本地映像缓存相关,而不是GAC。请参见:https://support.microsoft.com/en-us/kb/939242 - Manohar Reddy Poreddy

22

在这里探索一些类似的问题,如果您在注册表中进行更改,则可以在资源管理器中导航到GAC。

在HKEY_LOCAL_MACHINE\Software\Microsoft\Fusion下创建一个名为DisableCacheViewer的DWORD条目,并将其设置为1。

之后,打开一个新的资源管理器窗口,导航到例如c:\windows\assembly。


2

您可以在c:\windows\assembly的NativeImages_blabla文件夹中找到它们。此外,我注意到.NET 3.5及以上实际上不允许直接访问NGENed映像。我猜它已经回归到使用一个大型数据库来存储所有文件,但我无法确定,因为生成的映像在磁盘上看不到。


我的电脑中 c:\windows\assembly 目录下只有一个名为 "download" 的文件夹。在那里找不到以 "Native" 开头的任何文件。 - paseena
从Visual C# 2008 SDK提示符中运行。Ngen版本为“Microsoft(R)CLR本机映像生成器-版本2.0.50727.3053”。 - paseena
请确保文件存在于本地图像缓存中,使用 ngen /show MyAssembly 命令,然后在整个 Windows 目录中搜索该程序集。如果已正确安装在缓存中,我相信它会出现在搜索结果中。 - Teoman Soygul
是的,当我尝试显示时它在那里:“Native Images:ConsoleApplication4,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null” - paseena

2

尝试使用 ngen 显示 AssemblyName /verbose | findstr "File:"

例如: %windir%\Microsoft.NET\Framework\v4.0.30319\ngen.exe display System.Xaml /verbose | findstr "File:"


1

你看,找到位置花了很长很长的时间!

实际上,它在 c:\Windows\assembly 文件夹内,但当我打开这个文件夹时,我只能看到 .NET 组件,所以我认为可能会有一些隐藏的文件夹。于是我用管理员权限打开命令提示符,然后就能看到如下所示的文件夹列表...

GAC,  GAC_32,  GAC_64,  GAC_MSIL,  NativeImages_v2.0.50727_32
NativeImages_v2.0.50727_64,  NativeImages_v4.0.30319_32,
NativeImages_v4.0.30319_64

你看,这太神奇了。我的意思是,我只能看到必需的文件夹,但看不到程序集。好吧,没问题,开心点。
我的应用程序是在v4和64位编译中构建的,因此我的所需EXE文件位于NativeImages_v4.0.30319_64文件夹的根目录下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接