System.Reflection.Assembly ass; Type type ; object obj; ass = System.Reflection.Assembly.LoadFile(@"d:\TestReflect.dll"); type = ass.GetType("Webtest.ReflectTest");//必须使用名称空间+类名称 System.Reflection.MethodInfo method = type.GetMethods();//方法的名称
这样就可以得到了,你可以用admin
type = ass.GetType("Webtest.ReflectTest");替换掉这个字符串
(@"d:\TestReflect.dll"); 这里可以不写绝对路径吗? 反射主要用在什么地方呀?
@徐滔: 当然可以不写绝对路径,可以放在bin目录下或项目的某个文件夹下面,反正只要找到就可以
反射的用处嘛,典型的用法是工厂方法
/// <summary> /// 反射加载窗体信息 /// </summary> /// <param name="filePath">插件DLL路经</param> /// <param name="plugin">插件描述</param> /// <param name="loadedPlugins">记录已经加载出来的窗口</param> /// <param name="loadBars">存储已经加载出来的工具栏</param> /// <param name="stripItem">工具菜单</param> /// <param name="toolStrip">主菜单</param> /// <returns>bool</returns> public static bool RegiestPluginAssemblyForms(string filePath, Plugin plugin, List<string> loadedPlugins, Dictionary<string, ToolStrip> loadBars, ToolStripItem stripItem, ToolStrip toolStrip) { Assembly ab = Assembly.LoadFrom(filePath + plugin.NameSpace + "." + plugin.Exends); Type[] types = ab.GetTypes(); foreach (Type t in types) { if (t.GetInterface("IPluginForms") != null && t.Name == plugin.ClassName) { //判断窗体是否已打开 if (loadedPlugins.Contains(t.FullName)) return false; //根据反射 显示窗体信息 var obj = (IPluginForms)ab.CreateInstance(t.FullName); if (obj != null) { obj.ShowDlog(); //如果窗体显示成功 loadedPlugins.Add(t.FullName); //显示工具栏 ToolStrip child = obj.MenuInfo; toolStrip.Visible = true; toolStrip.AllowMerge = true; //合并菜单管理 ToolStripManager.RevertMerge(toolStrip); ToolStripManager.Merge(child, toolStrip); //存储已经加载显示出来的工具栏 if (!loadBars.ContainsKey(stripItem.Text)) loadBars.Add(stripItem.Text, child); } } } return true; }
关于代码,楼上的应该已经满足要求了.
反射就是动态的加载DLL,我之前用过一个精算的程序里面
是等待用户写算法以后,把算汉编译成dll然后再反射到程序里面,
不过反射一但把DLL动态引用到程序集里面,就不能再删除了,所以这一点要注意.