تولید کد Native زمانی اتفاق میافتد که کامپایلر JIT، کد اسمبلیهای MSIL را به کدهای Native در ماشین محلی کامپایل میکند و این عمل بلافاصله قبل از اجرای متد برای اولین بار اتفاق میافتد. این کد به صورت موقتی بوده و در حافظهای که برای پردازش در نظر گرفته شده ذخیره میشود و در پایان هر پردازش توسط سیستم عامل ویرایش میشود. کد Native به ازای هر بار شروع یک پردازش تولید میشود. ابزار Native Image Generator یا همان Ngen اقدام به تولید کد Native با استفاده از کامپایلر JIT نموده و آن را در هارد دیسک ذخیره مینماید. زمانیکه برنامه نیازمند یک اسمبلی CLR است، به جای بارگذاری خود اسمبلی، ایمیج کد Native آن بارگذاری میشود. به این نکته نیز توجه داشته باشید که CLR اطلاعاتی در مورد اینکه کدام اسمبلی، ایمیج کد Native است و این ایمیج در کجا و در چه زمانی تهیه شده است، دارد. کد Native باعث بهبود استفاده از حافظه میشود، زمانیکه یک اسمبلی بین پروسسها به اشتراک گذاشته شدهاست. تا قبل از EF6 کتابخانههای هستهای EF در زمان اجرا جزئی از دات نت فریمورک بودند و تولید کد Native آنها به صورت اتوماتیک انجام میشد. اما از نسخه 6، تمامی این کتابخانهها در داخل پکیج Nuget آن ترکیب شدهاند . پس برای تولید کد Native مربوط به فایل EntityFramework.dll نیازمند ابزار Ngen هستیم.
1- ابتدا یک برنامهی ساده کنسول ویندوز ساخته و از Package Manager Console دستور Install-package entityframework را اجرا نموده تا پکیج Ef به برنامه اضافه گردد.
using System;
using System.Data.Entity;
namespace UsingNgen
{
public class NgenDbContex : DbContext
{ }
class Program
{
static void Main()
{
var nGenCtx = new NgenDbContex();
Console.WriteLine("Press a key to exit...");
Console.ReadKey();
}
}
}
حال کد ساده بالا را به برنامه اضافه میکنیم و برنامه را Build میکنیم.
2- برای ثبت جزئیات اجرای برنامه از ابزار Windows Performance Recorder که جزئی از ویندوز میباشد، استفاده میکنیم. کافیست عبارت WPR را در نوار جستجوی ویندوز تایپ کنید تا این ابزار در دسترس قرار گیرد.
برای ضبط جزئیات، روی دکمهی Start کلیک کنید و به محل ذخیرهی فایل اجرایی حاصل از Build ویژوال استودیو رفته و آن را اجرا کنید. بعد از اتمام اجرا، جزئیات را ذخیره نمایید.
![]()
بعد از ذخیره فایل، در پنجره بالا دکمهای به نام Open in WPA ظاهر میشود. WPA مخفف Windows Performance Analyzer میباشد. آن را کلیک کنید تا محیط آنالایزر باز شود.
![]()
حال در سمت چپ این پنجره انواع آنالایزرها را مشاهده میکنید. روی آنالایزر Computation کلیک کنید و از زیرمجموعهی آن، CPU Usage را انتخاب کنید. آمار مربوط به برنامه خودمان را در تصویر بالا مشاهده میکنید. کل برنامه 164 میلی ثانیه زمان برده و فایل Clr.dll حدود 47 میلی ثانیه و یک فایل clrjit.dll نیز برای تولید کد JIT وجود دارد. حال برای تسریع در عمل شروع، از تکنیک Ngen به صورت زیر استفاده میکنیم.
3- دوباره به نوار جستجوی ویندوز رفته و ابزار Developer Command Prompt for VsXXXX را با امتیاز دسترسی از نوع Admin اجرا کنید. XXXX نسخهی ویژوال استودیو میباشد.
![]()
حال به محل ذخیره فایل اجرایی برنامه رفته و دستور Ngen Install EntityFramework.dll را تایپ کنید تا یک ایمیج کد Native از entityframework.dll ساخته شود. دوباره ابزار Windows Performance Recorder را لود کرده و روی دکمه Start کلیک کنید و فایل اجرایی برنامه را اجرا نمایید. پس از اتمام عملیات ثبت جزئیات، آن را در Windows Performance Analyzer باز نمایید.
![]()
همانطور که مشاهده میکنید کل برنامه ما 89 میلی ثانیه زمان برده و Clr.dll 29 ثانیه و به جای clrjit.dll فایل EntityFramework به صورت native تولید شده است.