Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determine if GAC'ed & NGen'ed assemblies are being used

Tags:

.net

ngen

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

like image 832
Dog Ears Avatar asked Feb 17 '10 16:02

Dog Ears


People also ask

How do I know if assembly is in the GAC?

To get information on the the assembly attributes (Version, Culture, PublicKeyToken), run the gacutil /l command which will return a list of all the assemblies in the GAC. You can also see the information associated with a particular assembly using the -l parameter.

How do I check if a DLL is in the GAC?

(You can verify the dll is missing from the GAC by opening the GAC c:\windows\assembly and seeing if it is listed.)

What is the GAC and where is it located?

Starting with the . NET Framework 4, the default location for the Global Assembly Cache is %windir%\Microsoft.NET\assembly. In earlier versions of the . NET Framework, the default location is %windir%\assembly.

How do I show the GAC in File Explorer?

Open assemblies from Global Assembly CacheIn the main menu, choose File | Open from GAC. Click Open from GAC. on the toolbar of the Assembly Explorer window. Press Ctrl+Shift+O .


2 Answers

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.

like image 194
Jesse C. Slicer Avatar answered Sep 21 '22 05:09

Jesse C. Slicer


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.

like image 35
Jorge Freitas Avatar answered Sep 18 '22 05:09

Jorge Freitas