日期:2014-05-19  浏览次数:20432 次

利用反射技术,动态加载指定类型问题
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( "类名 ")