Assembly.Load和Assembly.LoadFrom差异?

Cjr*_*eek 7 c# wpf .net-assembly

我的应用程序通过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;
}
Run Code Online (Sandbox Code Playgroud)

通常这工作正常,但正在加载的程序集包含某些控件的默认样式,这些控件将不会被应用.但是,如果我不通过Assembly.Load加载程序集,但将其保存到文件并通过Assembly.LoadFrom一切正常加载它.

那些有什么区别?为什么在直接从内存加载程序集时不起作用 - 或者为什么在首次将其保存到磁盘然后加载它时它Assembly.LoadFrom是否有效?

我很困惑,我想直接从内存加载程序集而不先保存它们.

小智 4

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

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

看来您的默认样式需要来自不在主机应用程序路径下的路径的程序集。