2012-03-16 127 views
2

我真的很想知道爲什麼assemblyResolver不工作?還我不能使用爲什麼AssemblyResolve不能正常工作?

的foreach(字節[]二進制中deCompressBinaries)
ApplicationHost.Load(二進制);

如何觸發AssemblyResolve?請看看我的參考問題:http://stackoverflow.com/questions/9721686/how-to-use-appdomain-createdomain-with-assemblyresolve

protected void LoadApplication() 
    { 

     AppDomainSetup domainSetup = new AppDomainSetup(); 
     domainSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; 
     domainSetup.DisallowBindingRedirects = false; 
     domainSetup.DisallowCodeDownload = true; 
     domainSetup.LoaderOptimization = LoaderOptimization.SingleDomain; 
     //domainSetup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; 
     ApplicationHost = AppDomain.CreateDomain("Test.Service", null, domainSetup); 
     object obj = ApplicationHost.CreateInstanceAndUnwrap("Test.Process", "Test.ApplicationLoader"); 

     Assembly objExecutingAssemblies = Assembly.GetExecutingAssembly(); 
     AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies(); 

     foreach (AssemblyName assName in arrReferencedAssmbNames) 
     { 
      ApplicationHost.Load(assName); 
     } 


     ApplicationHost.AssemblyResolve += new ResolveEventHandler(OnAssemblyResolve); 

     List<byte[]> deCompressBinaries = new List<byte[]>(); 
     foreach (var item in AppPackage.Item.AssemblyPackage) 
      deCompressBinaries.Add(item.Buffer); 
     var decompressvalues = DeCompress(deCompressBinaries); 
     deCompressBinaries.Clear(); 
     deCompressBinaries = decompressvalues.ToList(); 

     foreach (byte[] binary in deCompressBinaries) 
      ApplicationHost.Load(binary); 

     Assembly[] assAfter = AppDomain.CurrentDomain.GetAssemblies(); 
    } 

    Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     return Assembly.Load(args.Name); 
    } 
+0

[如何將AppDomain.CreateDomain與AssemblyResolve一起使用](http://stackoverflow.com/questions/9721686/how-to-use-appdomain-createdomain-with-assemblyresolve) – 2012-03-16 13:24:23

回答

3

AssemblyResolve將永遠不會觸發,因爲你在LoadApplication方法加載了所有的組件 - AssemblyResolve如果需要裝配參考文獻未能得到解決纔會被調用。

我會建議運行fuslogvw.exe,這樣你就可以看到發生了什麼。

如果要加載組件的需要的基礎上,代碼塊:

List<byte[]> deCompressBinaries = new List<byte[]>(); 
foreach (var item in AppPackage.Item.AssemblyPackage) 
deCompressBinaries.Add(item.Buffer); 
var decompressvalues = DeCompress(deCompressBinaries); 
deCompressBinaries.Clear(); 
deCompressBinaries = decompressvalues.ToList(); 

foreach (byte[] binary in deCompressBinaries) 
    ApplicationHost.Load(binary); 

Assembly[] assAfter = AppDomain.CurrentDomain.GetAssemblies(); 

將需要工作到AssemblyResolve。該塊當前將所有東西加載到AppDomain中,因此您必須重新編寫該邏輯塊。

當然,您可能想要做的另一件事是不重新發明輪子,並使用ILMerge

2

AssemblyResolve填充防火僅CLR的失敗通過其中一個原因加載程序集。這個事件不會因爲你從字節數組中加載你的程序集而被觸發。

以下是一些示例。

  • 此代碼AssemblyResolve事件,因爲 「System.Drawing中」 作爲一個組件名稱是不夠的。

    object obj2 = ApplicationHost.CreateInstanceAndUnwrap("System.Drawing", "System.Drawing.Rectangle"); 
    
  • 此代碼不會AssemblyResolve事件,因爲 「System.Drawing中,版本= 4.0.0.0,文化=中性公鑰= b03f5f7f11d50a3a」 是一個完全合格的組件名稱。

    object obj2 = ApplicationHost.CreateInstanceAndUnwrap("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Rectangle");