为什么AssemblyResolve事件试图解析已经在AppDomain中加载的程序集?

时间:2016-12-20 16:39:40

标签: c# .net .net-assembly assembly-resolution

我有一项服务,涉及从云存储下载程序集,使用Activator.CreateInstance创建它的实例,然后在其上调用方法。

我已经设置了AssemblyResolve方法来下载依赖项工作正常,但是为了测试/实验我现在正在尝试手动下载程序集。我已经找到了需要哪些依赖项,下载它们然后使用

加载它们
Assembly.Load(byte[])

之后我可以看到它们已经通过

加载到AppDomain中
AppDomain.CurrentDomain.GetAssemblies())

但是当我在程序集上调用引用它的方法时,它仍然会转到AssemblyResolver。

我可能误解了加载程序集和AppDomain的工作方式,但在我看来,一旦加载程序集,它应该可用于此程序集并且它不应该解决它吗?

为什么不能"看到"它?版本和名称等是相同的。

我已经阅读了不同的程序集绑定上下文here,我认为这可能是问题所在?它建议使用Assembly.Load(字符串)加载到与Assembly.Load(byte)不同的上下文?在这种情况下,当我将内存中的程序集作为byte []?

时,如何执行此操作

由于

1 个答案:

答案 0 :(得分:0)

您需要直接从加载的程序集中获取Type,因为它未加载到正确的上下文中。

var assembly = Assembly.Load(File.ReadAllBytes(some_path));

// This will work. Note that you don't need the assembly-qualified name,
// as you are asking the assembly directly for the type.
var type1 = assembly.GetType("My.Special.Type");

// This will not work - the assembly "My.Assembly" is not loaded into
// the Load context, so the type is not available.
var type2 = Type.GetType("My.Special.Type, My.Assembly");

在上面的代码中,type1将引用Type,但type2将为null,因为程序集未加载到正常的Load上下文中。