2010-02-17 18 views
8

如何在運行時無需Loader驗證程序集簽名或者甚至使用GAC'ed程序集來確定是否正在使用本機圖像?確定是否正在使用GAC'ed和NGen'ed程序集

我有一個複雜的系統,我們正在試驗NGen,但是現在我們正在從所有DLL所在的文件夾運行exe文件,這是因爲很多後期綁定依賴關係,看着Process Explorer,它看起來像本機圖像正在使用,但我怎麼能確定我獲得了全部的好處並消除了加載程序驗證步驟?

乾杯, 格雷姆。

更新: 我得到很多這種從集綁定日誌查看器的事情:

LOG: [Level 1]Start validating IL dependency MyCompany.Entities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7cd8595f4671c5dd. 
LOG: Dependency evaluation succeeded. 

,並在年底

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. 

因此它使用本地圖片但仍然驗證它們,即不使用GAC版本,即使這是我創建原始圖像的地方,像這樣:

ngen install "MyCompany.Entites, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7cd8595f4671c5dd, processorArchitecture=MSIL" 

腳註: 這篇文章似乎暗示,如果組件不是從GAC加載,那麼驗證過程將抵消NGen的優勢? CLR Inside Out - Improving Application Startup Performance (MSDN)

更新 - 正如Nobugz在下面評論指出,上述驗證步驟是不是因爲3.5 SP1見執行:MSDN Docs on NGen

回答

11

您可以從Fuslogvw.exe工具輕鬆地看到它。從Visual Studio命令提示符啓動它。使用日誌類別=本機映像,設置+日誌全部綁定到磁盤進行配置。運行你的程序。回到fuslogvw,刷新。它會顯示所有已加載組件的列表。

雙擊一個條目以查看程序集是如何加載的。如果從GAC來了,你會看到:

LOG:從C的裝填IL彙編:\ WINDOWS \裝配\ GAC_MSIL \ blahblah

如果NGEN-ED圖像中使用,你將會看到:

LOG:綁定到本地映像成功。

+0

+1這看起來很有前途,但我認爲這證明我的本地圖像不是從GAC使用,所以他們仍然正在驗證的加載,有效地抵消了ngen的優勢,請參閱我原來編輯的Q. –

+1

@dog - 看起來很清楚,程序集並未從GAC加載,但它確實使用Ngen-ed圖像。這個是正常的。不確定可能存在什麼其他問題,如果這是您擔心的問題,強烈的名稱驗證將被完全信任地忽略。 –

+0

我已經添加了一個腳註,它是我試圖消除的那篇文章中提到的加載器驗證。 –

1

你可以看到,如果裝配在GAC來很容易地:

Assembly assembly = Assembly.GetExecutingAssembly(); 

if (assembly.GlobalAssemblyCache) 
{ 
    Console.WriteLine("I'm in the GAC!"); 
} 

編輯:找到一種方法...

爲了查看它是否是NGEN'd,您必須直接讀取程序集並查看預編譯頭文件字段是否有按照this page的數據。在達到這個價值時我有點生疏,但那應該做到。我沒有看到通過反射方法找出它的方法。

+2

我可以通過查看Process Explorer中DLL的視圖窗格來確定它們是否爲NGen,方法是將鼠標懸停在名稱上,使其具有完整路徑,如... c:\ Windows \ Assembly \ NativeImages_v2.0.5072_32 \ MyDll.ni .dll –

+0

在我的回答中添加了一些線索。 –

+0

downvote,downvoter的原因是什麼? –

0

您可以使用VMMAP。在那裏,所有.dll(程序集)都具有位置詳細信息

詳細說明如果從「C:\ Windows \ assembly \ NativeImages(版本)...」加載程序集,以便您的應用程序使用本機映像。

相關問題