C# 为什么在尝试Assembly.ReflectionOnlyLoad时未执行ReflectionOnlyAsemblyResolve?

C# 为什么在尝试Assembly.ReflectionOnlyLoad时未执行ReflectionOnlyAsemblyResolve?,c#,.net,assemblies,clr,assembly.reflectiononly,C#,.net,Assemblies,Clr,Assembly.reflectiononly,我正试图通过连接到AppDomain.AssemblyResolve和AppDomain.ReflectionOnlyAssemblyResolve事件来加载一些模块。虽然我让前者工作,但后者却惨遭失败。我把我的问题归结为这个小程序: public static class AssemblyLoader { static void Main(string[] args) { AppDomain.CurrentDomain.ReflectionOnlyAssembl

我正试图通过连接到
AppDomain.AssemblyResolve
AppDomain.ReflectionOnlyAssemblyResolve
事件来加载一些模块。虽然我让前者工作,但后者却惨遭失败。我把我的问题归结为这个小程序:

public static class AssemblyLoader
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += 
            ReflectionOnlyAssemblyResolve;

        // fails with FileNotFoundException
        Assembly.ReflectionOnlyLoad("Foo");
    }

    public static Assembly ReflectionOnlyAssemblyResolve(object sender, 
        ResolveEventArgs args)
    {
        Trace.TraceInformation(
            "Failed resolving Assembly {0} for reflection", args.Name);

        return null;
    }
}
尝试
汇编.ReflectionOnlyLoad
时,运行此程序失败,出现
FileNotFoundException
,但它不调用ReflectionOnlyAsemblyResolve处理程序。我在那里被难住了

有没有人知道这可能是什么原因,以及如何让它起作用


谢谢

ReflectionOnlyaSemblyResolve事件似乎仅用于解析依赖项,而不是顶级程序集,如下所示:

在这里:


扩展casperOne的答案

如果要拦截直接程序集解析事件,则需要挂接到AppDomain.AssemblyResolve事件。但这是一个全局钩子,因此单独使用它不适合您的场景。但是,如果您的应用程序是单线程的,则可以进行短期连接以拦截特定的解析事件

static void LoadWithIntercept(string assemblyName) {
  var domain = AppDomain.CurrentDomain;
  domain.AssemblyResolve += MyInterceptMethod;
  try {
    Assembly.ReflectionOnlyLoad(assemblyName);
  } finally {
    domain.AssemblyResolve -= MyInterceptMethod;
  }
}

private static Assembly MyInterceptMethod(object sender, ResolveEventArgs e) {
 // do custom code here 
}

您可以通过如下方式在程序集上调用ExportedTypes来强制执行此操作:

var dummy = asm.ExportedTypes;
因此,如果要递归加载包含所有引用的程序集:

 private void _forceAssemblyResolve(Assembly asm) { var dummy = asm.ExportedTypes; }

 var result= Assembly.ReflectionOnlyLoad("Foo");
 _forceAssemblyResolve(result);

public static Assembly ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
    var childAssembly = _resolve(args);
    _forceAssemblyResolve(childAssembly);
}

使用ReflectionOnlyLoad()时不会触发AssemblyResolve。据我所知,这是出于设计目的,以避免加载ReflectionOnlyLoad()用户不“想要”的程序集。不过,我还不确定自己是否完全同意这一观点。有没有办法阻止仅加载程序集的反射失败的尝试?@derabink我想这是一个单独的问题。