2010-12-03 45 views
0

我創建了一個測試項目來理解反射。我正在從.NET 4.0 GAC加載程序集。 (據我所知,.NET 4.0保持它的GAC在C:\ WINDOWS \ Microsoft.NET \組裝)Assembly.GlobalAssemblyCache返回FALSE,雖然程序集是從GAC加載的

我寫了這樣的代碼:

Assembly testAssembly = Assembly.ReflectionOnlyLoadFrom(@"C:\WINDOWS\Microsoft.NET\assembly\GAC_32\TestReflection\v4.0_1.0.0.0__7ff2353191526e8c\TestReflection.dll"); 

     if(testAssembly.GlobalAssemblyCache) 
      Console.WriteLine(testAssembly.FullName); 

當我運行這段代碼,GlobalAssemblyCache屬性始終儘管我正在從GAC加載程序集,但仍然返回FALSE。

有人可以告訴我原因嗎?或者我錯過了什麼?

回答

1

您可能首先需要確保您的程序集實際上已加載到GAC中。對於這樣做,你可以嘗試以下方法:

gacutil /l System.Data 

這將與大會在GAC的細節提供:

Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1 
Copyright (c) Microsoft Corporation. All rights reserved. 

The Global Assembly Cache contains the following assemblies: 
    System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86 
    System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
    System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86 

Number of items = 3 

然後從GAC加載程序集的ReflectionOnly使用情況,您可以嘗試的ReflectionOnlyLoad代替ReflectionOnlyLoadFrom

的例子:

Assembly testAssembly = Assembly.ReflectionOnlyLoad(@"System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86"); 

if (testAssembly.GlobalAssemblyCache) { 
    Console.WriteLine(testAssembly.FullName); 
    Console.WriteLine(testAssembly.Location); 
} else { 
    Console.WriteLine("Not found in GAC"); 
} 

以上給出了以下輸出:

System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll 

希望有所幫助!

+0

這真的很有幫助。但是當我運行gacutil/l TestReflection.dll時,它說找到0個程序集。但是當我真正轉到.NET 4.0的GAC文件夾時,我可以在那裏看到程序集。任何想法可能是什麼問題? – Learner 2010-12-03 08:43:23

相關問題