动态加载动态库内容的时候,出现了下面的错误。
开发机上没有问题,其它两台测试机上有问题。
下面是输出的错误信息:
异常类型:TargetInvocationException
异常消息:调用的目标发生了异常。
异常信息: 在 System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
在 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
在 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
在 System.Activator.CreateInstance(Type type, Boolean nonPublic)
在 System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)
在 System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
在 System.Reflection.Assembly.CreateInstance(String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
在 System.Reflection.Assembly.CreateInstance(String typeName)
在 CFW.WinForm.FrmMain.CreateForm(String className, String assemblyName
在 CFW.WinForm.FrmMain.AddTabItem(S_Menu menu)
... ...
源代码:
///
/// 根据命名空间、类名创建窗口
///
///
///
///
private Form CreateForm(string className,string assemblyName)
{
//项目的Assembly选项名称
string path = Application.StartupPath + "\\" + assemblyName + ".dll";
Assembly ass = Assembly.LoadFile(path);
Form fm = (Form)Assembly.LoadFile(path).CreateInstance(className);
Type fmType = fm.GetType();
if (fmType.GetInterface("IFormBase") != null)
{
fmType.GetProperty("LoginUser").SetValue(fm, this.LoginUser);
fmType.GetProperty("LoginDept").SetValue(fm, this.LoginDept);
}
fm.Tag = className;
return fm;
}
出错位置在“Form fm = (Form)Assembly.LoadFile(path).CreateInstance(className);”这一句。
通过度娘看了很多关于本问题的中文文档,有人提示必须加被加载dll的引用,有人提示cpu架构要保持一致(x86->x86,x64->x64),.Net Framework 框架要一致,甚至数据库是否正常连接。 还有人提示路径不对啥的。按照这些提示的思路去做,真的可能让人越来越产生绝望感。
后来在google上用英文“An exception occurred for the target of the call ”去查找答案,也没有找到直接的答案,但是有位高手的建议帮我找到了问题的真正原因。(参考这篇文章:
Exception has been thrown by the target of an invocation, when COM DLL’s are called by reflection technique in C#)
那就是,**TargetInvocationException掩盖了问题的真正原因,要查看Exception的InnerException。
** 我输出InnerException,内容如下:
异常类型:FileNotFoundException
异常消息:未能加载文件或程序集“Microsoft.ReportViewer.Common, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91”或它的某一个依赖项。系统找不到指定的文件。
异常信息: 在 CFW.WinForm.FrmMain.AddTabItem(S_Menu menu)
... ...
看到这些信息,瞬间明白加载对象DLL所依赖的Dll文件缺乏导致这次事故!
从上面的信息找到问题原因之后,解决办法就很简单了。本次的解决办法是将缺少的DLL文件放到加载路径相同路径下,就正常了。 当然,解决办法会因问题而异,主要参考InnerException的提示。