1

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

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

什么可能导致这个问题?

4

2 回答 2

1

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;
    }

加油微软,你真的可以更好地记录这一点!

于 2020-11-26T20:11:57.220 回答
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.

于 2011-12-05T19:38:12.827 回答