我正在动态加载程序集并从中调用静态方法。当该方法使用非平凡的引用(例如mscorlib或System.Core)时会出现问题 - 我得到System.MissingMethodException
。我已经尝试浏览已加载程序集的引用程序集并手动将它们全部加载,从而强制将它们加载到AppDomain上。我已经检查CurrentDomain.GetAssemblies
,已加载程序集。
引用是第三方库,我知道加载了正确的版本(来自CurrentDomain.GetAssemblies
)。
什么可能导致这个问题?
答案 0 :(得分:1)
8年后,我不是第一个想到这个的人...
使用AssemblyResolve
或ReflectionOnlyAssemblyResolve
从自定义位置解析程序集时,必须确保加载的程序集{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
。