利用反射技术,动态加载指定类型问题
private static readonly string path = ConfigurationManager.AppSettings[ "assembly "];
public static IDAL.IAccount CreateAccount()
{
string className = path + ".Account ";
return (IDAL.IAccount)Assembly.Load(path).CreateInstance(className);
}
却出现了下面的错误!
"
未能加载文件或程序集“SQLServerDAL”或它的某一个依赖项。系统找不到指定的文件。
"什么问题来的?
------解决方案--------------------你确实需要程序支持多种数据库吗?
我不建议你这样做,直接引用效率更高。也更方便。何乐而不为?
------解决方案--------------------1、要把被反射的DLL文件引用的DLL文件都放到同一个目录下;
2、被反射的DLL文件要放在bin目录下。
我对发射不太了解,你试试看吧。
------解决方案--------------------很清楚了,找不到文件,path是什么来着?
------解决方案-------------------- public static Assembly[] LoadDlls(string dllPath)
{
string[] dlls = Directory.GetFiles(dllPath, "*.dll ");
Assembly[] assemblyCollection = new Assembly[dlls.Length];
for (int i=0; i <= assemblyCollection.Length - 1;i++)
{
string dll = dlls[i].Substring(dlls[i].LastIndexOf(@ "\ ") + 1);
assemblyCollection[i] = Assembly.LoadFrom(dlls[i]);
}
return assemblyCollection;
}
------解决方案--------------------三句:
1、加载程序集:assemblyCollection[i] = Assembly.LoadFrom(dlls[i]);
2、获取程序集里的类:Type[] types = assembly.GetTypes();
3、反射得到实例:Activator.CreateInstance(type[i]);
------解决方案--------------------遇到过同样的问题,
如果你是基于组件的开发,可能是没有把某个dll引用到,看看bin目录下是否所有用的dll都存在了,没有的化引用一下
------解决方案--------------------你看一下你的DLL文件是不都引用了。
------解决方案--------------------分清楚 Load 和 LoadFrom 。
------解决方案--------------------System.Reflection.Assembly.Load( "app_code ")
既不是 AssemblyName,也不带后缀。从你的“string path”看起来,你是在读dll;从“className = path + ".Account ";”看起来,你又是把它当作AssemblyName了,四不像。
------解决方案--------------------学习了
------解决方案--------------------http://www.cnblogs.com/ltp/archive/2006/02/18/333295.html
李天平博客有详细说明
------解决方案--------------------Assembly ass = Assembly.Load( "名词空间.类名 ");
Type t = ass.GetType( "类名 ")