【问题标题】:Assembly.Load and Assembly.LoadFrom differences?Assembly.Load 和 Assembly.LoadFrom 的区别?
【发布时间】:2017-09-28 10:03:49
【问题描述】:

我的应用程序通过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 加载它时起作用?

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

【问题讨论】:

    标签: c# wpf .net-assembly


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多