问题
How do I determine if the Native images are being used without the Loader verifing the signature of the assembly at runtime, or even using the GAC'ed assembly?
I have complex system that we're experimenting with NGen but currently we're running the exe from the folder where all the DLL's are located due to a lot of late binding dependencies, looking at Process Explorer, it looks like the Native images are being used, but how can I be sure I'm getting the full benefit and eliminating the Loader Verification step?
Cheers, Graeme.
Update: I'm getting lots of this sort of thing from the Assembly Binding Log viewer:
LOG: [Level 1]Start validating IL dependency MyCompany.Entities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7cd8595f4671c5dd.
LOG: Dependency evaluation succeeded.
and at the end
LOG: Validation of dependencies succeeded.
LOG: Start loading all the dependencies into load context.
LOG: Loading of dependencies succeeded.
LOG: Bind to native image succeeded.
Native image has correct version information.
Attempting to use native image C:\Windows\assembly\NativeImages_v2.0.50727_32\MyCompany.Mylibrary#\4710bb8309419d707681bd360088181f\MyCompany.MyLibrary.MyClass.ni.dll.
ZAP: Native image has been relocated.
Native image successfully used.
So it's using the Native images but still verifying them, i.e. not using the GAC version even though that's where I created the Native image from, Like so:
ngen install "MyCompany.Entites, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7cd8595f4671c5dd, processorArchitecture=MSIL"
Footnote: This articles seems to imply that if the assemblies are not loaded from the GAC then the verification process will offset the NGen advantages? CLR Inside Out - Improving Application Startup Performance (MSDN)
Update - As Nobugz has pointed out in a comment below, the verification step mentioned above is not performed since 3.5 SP1 see:MSDN Docs on NGen
回答1:
You can easily see it from the Fuslogvw.exe tool. Start it from the Visual Studio Command Prompt. Configure it with Log Categories = Native Images, Settings + Log all binds to disk. Run your program. Back to fuslogvw, Refresh. It will show you a list of all assemblies that got loaded.
Double-click an entry to see how the assembly got loaded. If it came from the GAC, you'll see:
LOG: IL assembly loaded from C:\Windows\assembly\GAC_MSIL\blahblah
If the Ngen-ed images was used, you'll see:
LOG: Bind to native image succeeded.
回答2:
You can see if the assembly came from the GAC pretty easily:
Assembly assembly = Assembly.GetExecutingAssembly();
if (assembly.GlobalAssemblyCache)
{
Console.WriteLine("I'm in the GAC!");
}
EDIT: found a way...
In order to see if it is NGEN'd, you have to read the assembly directly and see if the Precompile Header field has data as per this page. I'm a bit rusty on getting to that value, but that should do it. I don't see a way to figure it out via the reflection methods.
回答3:
You can use the VMMAP. There, all the .dll (assembly) have location details
In details if your assembly is being loaded from "C:\Windows\assembly\NativeImages(version)..." so your application are using the native image.
来源:https://stackoverflow.com/questions/2282397/determine-if-gaced-ngened-assemblies-are-being-used