通过反射调用方法会导致System.MissingMethodException
本文关键字:System MissingMethodException 方法 反射 调用 | 更新日期: 2023-09-27 18:17:03
我正在动态加载程序集并从中调用静态方法。当方法使用一个不重要的引用(例如mscorlib或System.Core)时,问题就出现了——我得到System.MissingMethodException
。我尝试遍历已加载程序集的引用程序集并手动加载它们,从而强制将它们加载到AppDomain。我已检查CurrentDomain.GetAssemblies
,组件已加载。
参考是一个第三方库,我知道正确的版本加载(从CurrentDomain.GetAssemblies
)。
什么会导致这个问题?
我肯定不是第一个在8年后发现这一点的人。
当使用AssemblyResolve
或ReflectionOnlyAssemblyResolve
从自定义位置解析程序集时,您必须确保通过Assembly.Load
加载的程序集实例是唯一的,因为相同的名称可能传递到AssemblyResolve
…AppDomain本身就很混乱,因为它没有缓存加载的程序集!!
private static Dictionary<string, Assembly> _resolved = new Dictionary<string, Assembly>();
private static Assembly ResolveDependencies(object sender, ResolveEventArgs args)
{
if (_resolved.ContainsKey(args.Name))
{
return _resolved[args.Name];
}
var asm = Assembly.Load(GetEmbeddedAssembly(args.Name));
_resolved[args.Name] = asm;
return asm;
}
来吧,微软,你真的可以更好地记录这个!
您使用什么方法来调用该静态方法?
我会使用:
typeof(YourType).GetMethod("YourMethodName",
BindingFlags.Public | BindingFlags.Static).Invoke(null, your_params);
如果碰巧该方法实际上是在基类中实现的,则需要:
typeof(YourType).GetMethod("YourMethodName",
BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
.Invoke(null, your_params);
如果该方法不是公共的,则必须添加BindingFlags.NonPublic
。
如果您想从外部程序集获取它,请使用Assembly.GetType()
而不是typeof
。