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

时间:2011-12-05 18:53:39

标签: c# .net vb.net system.reflection

我正在动态加载程序集并从中调用静态方法。当该方法使用非平凡的引用(例如mscorlib或System.Core)时会出现问题 - 我得到System.MissingMethodException。我已经尝试浏览已加载程序集的引用程序集并手动将它们全部加载,从而强制将它们加载到AppDomain上。我已经检查CurrentDomain.GetAssemblies,已加载程序集。

引用是第三方库,我知道加载了正确的版本(来自CurrentDomain.GetAssemblies)。

什么可能导致这个问题?

2 个答案:

答案 0 :(得分:1)

8年后,我不是第一个想到这个的人...

使用AssemblyResolveReflectionOnlyAssemblyResolve从自定义位置解析程序集时,必须确保加载的程序集{strong>实例(例如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;
    }

来微软吧,您确实可以对此做更好的记录!

答案 1 :(得分:0)

您使用什么方法调用静态方法?

我会用:

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