通过反射调用方法会导致System.MissingMethodException

本文关键字:System MissingMethodException 方法 反射 调用 | 更新日期: 2023-09-27 18:17:03

我正在动态加载程序集并从中调用静态方法。当方法使用一个不重要的引用(例如mscorlib或System.Core)时,问题就出现了——我得到System.MissingMethodException。我尝试遍历已加载程序集的引用程序集并手动加载它们,从而强制将它们加载到AppDomain。我已检查CurrentDomain.GetAssemblies,组件已加载。

参考是一个第三方库,我知道正确的版本加载(从CurrentDomain.GetAssemblies)。

什么会导致这个问题?

通过反射调用方法会导致System.MissingMethodException

我肯定不是第一个在8年后发现这一点的人。

当使用AssemblyResolveReflectionOnlyAssemblyResolve从自定义位置解析程序集时,您必须确保通过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