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我想这是一个单独的问题。