我的应用程序通过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
加载它时它是否有效?
我很困惑,我想直接从内存加载程序集而不先保存它们。
答案 0 :(得分:1)
Assembly.Load和Assembly.LoadFrom使用不同的加载上下文。 Assembly.Load在宿主程序集(default context)的上下文中加载程序集。为了正确加载,所有从属程序集都应可从主机应用程序路径GAC获得,或者应预先手动加载。
Assembly.LoadFrom不使用主机程序集上下文。它创建自己的加载上下文(load-from context),并能够自动解析默认上下文中不存在的depandant程序集。这些程序集来自不在主机应用程序路径下的路径。
似乎您的默认样式要求程序集的路径不在主机应用程序路径下。