2012-03-16 129 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");