【问题标题】:why AssemblyResolve not working?为什么 AssemblyResolve 不起作用?
【发布时间】:2012-03-16 09:25:00
【问题描述】:

我真的很想知道为什么 assemblyResolver 不起作用?我也不能用

foreach(deCompressBinaries 中的 byte[] 二进制文件)
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);
    }

【问题讨论】:

标签: c# .net plugins appdomain


【解决方案1】:

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, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”是完全合格的程序集名字。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 2019-08-06
      • 2016-07-05
      • 2011-08-06
      • 2013-01-18
      相关资源
      最近更新 更多