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

C# 通过反射调用方法会导致System.MissingMethodException,c#,.net,vb.net,system.reflection,C#,.net,Vb.net,System.reflection,我正在动态加载程序集并从中调用静态方法。当方法使用一个不平凡的引用(例如mscorlib或System.Core)时,问题就会出现-我得到System.MissingMethodException。我尝试过遍历已加载程序集的引用程序集并手动加载它们,从而强制将它们加载到AppDomain。我已经检查了CurrentDomain.GetAssemblies,程序集已加载 该参考是第三方库,我知道已加载正确的版本(从CurrentDomain.GetAssemblies) 什么可能导致此问题?您使用

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

该参考是第三方库,我知道已加载正确的版本(从
CurrentDomain.GetAssemblies


什么可能导致此问题?

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

我将使用:

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

您使用什么方法来调用该静态方法

我将使用:

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

我不是第一个在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;
    }
private static Dictionary\u resolved=new Dictionary();
私有静态程序集ResolveDependencies(对象发送方、ResolveEventArgs args args)
{
if(_resolved.ContainsKey(args.Name))
{
返回_已解析[args.Name];
}
var asm=Assembly.Load(GetEmbeddedAssembly(args.Name));
_已解析[args.Name]=asm;
返回asm;
}

来吧,微软,你真的可以更好地记录这一点

我不是第一个在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;
    }
private static Dictionary\u resolved=new Dictionary();
私有静态程序集ResolveDependencies(对象发送方、ResolveEventArgs args args)
{
if(_resolved.ContainsKey(args.Name))
{
返回_已解析[args.Name];
}
var asm=Assembly.Load(GetEmbeddedAssembly(args.Name));
_已解析[args.Name]=asm;
返回asm;
}

来吧,微软,你真的可以更好地记录这一点

确保在JITting方法之前加载程序集,@SLaks该代码与调用
Assembly.LoadFrom
、查找类型、查找静态方法、调用无参数调用一样简单。程序集加载代码是在调用之前通过迭代引用的程序集来完成的(正如我所说,AppDomain对象识别加载)。这可能是LoadFrom上下文的问题@SLaks此消息引起了我的注意:“如果一个程序集加载了LoadFrom,并且加载上下文中的一个程序集稍后尝试按显示名称加载相同的程序集,则加载尝试失败。”,但是,当我没有程序集加载循环时,问题仍然存在。如果您能够提供一个新的方法,以便我们能够重现问题,这将非常有帮助。请确保在JITting方法之前加载程序集,@SLaks代码非常简单,只需调用
assembly.LoadFrom
,查找类型,查找静态方法,在没有参数的情况下调用invoke。程序集加载代码是在调用之前通过迭代引用的程序集来完成的(正如我所说,AppDomain对象识别加载)。这可能是LoadFrom上下文的问题@SLaks此消息引起了我的注意:“如果一个程序集加载了LoadFrom,并且加载上下文中的一个程序集稍后尝试按显示名称加载相同的程序集,则加载尝试失败。”,但是,当我没有程序集加载循环时,问题仍然存在。如果您可以提供一个方法,以便我们可以重现问题,这将非常有帮助。方法是公共的,可以找到并可以调用。问题是,当它执行时(不一定立即执行),它试图从它的一个引用调用一个方法(正如我所说的,该引用已加载到AppDomain),但失败,导致MissingMethodException。问题是,当它执行时(不一定立即执行),它试图从它的一个引用调用一个方法(正如我所说,该引用已加载到AppDomain),但由于MissingMethodException而失败。