Assembly.Load和Assembly.LoadFrom有什么区别?

8

我的应用程序通过AppDomain.CurrentDomain.AssemblyResolve 事件加载所需的程序集。这些程序集是执行程序集的资源。

private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
{
    var executingAssembly = Assembly.GetExecutingAssembly();
    var assemblyName = new AssemblyName(args.Name);
    var resPath = assemblyName.Name + ".dll";

    using (var stream = executingAssembly.GetManifestResourceStream(resPath))
    {
        if (stream != null)
        {
            byte[] buffer = new byte[stream.Length];
            stream.Read(buffer, 0, buffer.Length);

            return Assembly.Load(buffer);
        }
    }

    return null;
}

一般而言,这个方法可以正常工作,但是被加载的程序集包含某些控件的默认样式,这些样式不会被应用。但是,如果我不通过Assembly.Load来加载程序集,而是将其保存到文件中并通过Assembly.LoadFrom加载,一切都能够很好地运行。
这两者之间有什么区别?为什么直接从内存中加载程序集无法正常工作,或者为什么先将程序集保存到磁盘上再使用Assembly.LoadFrom加载时就能顺利运行呢?
我感到非常困惑,希望能够直接从内存中加载程序集而不必先将其保存到磁盘上。
1个回答

4

Assembly.Load和Assembly.LoadFrom使用不同的加载上下文。Assembly.Load在主机程序集上下文(默认上下文)中加载程序集。为了正确加载所有依赖程序集,应该从主机应用程序路径或全局程序集缓存(GAC)中获取这些程序集,或者需要提前手动加载。

Assembly.LoadFrom不使用主机程序集上下文。它创建自己的加载上下文(从上下文中加载),并且能够自动解析在默认上下文中不存在的依赖程序集。这些程序集来自于不在主机应用程序路径下的路径。

看起来你的默认样式需要从不在主机应用程序路径下的路径中获取程序集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接