我有一项服务,涉及从云存储下载程序集,使用Activator.CreateInstance创建它的实例,然后在其上调用方法。
我已经设置了AssemblyResolve方法来下载依赖项工作正常,但是为了测试/实验我现在正在尝试手动下载程序集。我已经找到了需要哪些依赖项,下载它们然后使用
加载它们Assembly.Load(byte[])
之后我可以看到它们已经通过
加载到AppDomain中AppDomain.CurrentDomain.GetAssemblies())
但是当我在程序集上调用引用它的方法时,它仍然会转到AssemblyResolver。
我可能误解了加载程序集和AppDomain的工作方式,但在我看来,一旦加载程序集,它应该可用于此程序集并且它不应该解决它吗?
为什么不能"看到"它?版本和名称等是相同的。
我已经阅读了不同的程序集绑定上下文here,我认为这可能是问题所在?它建议使用Assembly.Load(字符串)加载到与Assembly.Load(byte)不同的上下文?在这种情况下,当我将内存中的程序集作为byte []?
时,如何执行此操作由于
答案 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上下文中。