Вот класс для загрузки плагинов
| Код | using System; using System.IO; using System.Reflection; using System.CodeDom.Compiler; using Microsoft.CSharp; using System.Windows.Forms; using System.Xml; using System.Collections;
namespace omis { /// <summary> /// Summary description for Loader. /// </summary> public class Loader { public Loader() { }
public static object LoadModule(string name, object arg) { Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); for (int i=0; i<asms.Length; i++) { Type typ = asms[i].GetType(name, false, true); if (typ != null) { try { object[] args = new object[1]; args[0] = arg; return typ.InvokeMember(null, BindingFlags.CreateInstance, null, null, args); } catch (Exception ex) { omis.console.Console.ReportWarning("omis.Loader", "Failed create instance of "+name, ex.Message+"\r\n"+ex.StackTrace); } } } return null; }
public static Type[] GetTypeFromBase(string name) { ArrayList cach = new ArrayList(); Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); for (int i=0; i<asms.Length; i++) { Type[] tp = asms[i].GetTypes(); for (int k=0; k<tp.Length; k++) { if (tp[k].BaseType != null && tp[k].BaseType.ToString().ToLower() == name) cach.Add(tp[k]); } }
if (cach.Count > 0) { Type[] ret = new Type[cach.Count]; for (int i=0; i<cach.Count; i++) ret[i] = (Type)cach[i]; cach.Clear(); return ret; } return null; }
public static Type GetModule(string name) { Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); for (int i=0; i<asms.Length; i++) { Type typ = asms[i].GetType(name, false, true); if (typ != null) { return typ; } }
string[] sname = name.Split('.'); string pname = "../libs"; for (int i=0; i<sname.Length-1; i++) pname += "/"+sname[i]; string fname = pname+"/"+sname[sname.Length-1];
try { StreamReader fs = new StreamReader(fname+".cs", System.Text.Encoding.GetEncoding("WINDOWS-1251")); string src = fs.ReadToEnd(); fs.Close();
CSharpCodeProvider code = new CSharpCodeProvider(); ICodeCompiler comp = code.CreateCompiler();
CompilerParameters opt = new CompilerParameters(); opt.GenerateInMemory = true; opt.GenerateExecutable = false; opt.OutputAssembly = null; //fname+".dll"; opt.IncludeDebugInformation = false; opt.ReferencedAssemblies.Add("C:\\WINNT\\Microsoft.NET\\Framework\\v1.0.3705\\System.Xml.dll"); opt.ReferencedAssemblies.Add("C:\\WINNT\\Microsoft.NET\\Framework\\v1.0.3705\\System.Windows.Forms.dll"); opt.ReferencedAssemblies.Add("C:\\WINNT\\Microsoft.NET\\Framework\\v1.0.3705\\System.Drawing.dll"); opt.ReferencedAssemblies.Add("C:\\WINNT\\Microsoft.NET\\Framework\\v1.0.3705\\System.dll"); CompilerResults res = comp.CompileAssemblyFromSource(opt, src);
if (res.Errors.Count > 0) { for (int i=0; i < res.Errors.Count; i++) omis.console.Console.ReportWarning("omis.Loader.GetModule", res.Errors[i].ErrorText, fname); } else { Type typ = res.CompiledAssembly.GetType(name, true, true); if (typ != null) { return typ; } } } catch (Exception ex) { omis.console.Console.ReportError("omis.Loader.GetModule", ex.Message, fname); } return null; } } }
|
LoadModule() возвращает обьект класса по имени |