C#实现动态加载dll的方法
本文实例讲述了C#实现动态加载dll的方法。分享给大家供大家参考。具体实现方法如下:
using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.IO;namespace Alif.CommonAPI.DynamicLoadAssembly { public class AssemblyDynamicLoader<T> { private AppDomain appDomain;
private DynamicRemoteLoadAssembly<T> remoteLoader;
public T InvokeMethod(string assemblyName, string assemblyPath, string assemblyConfigFilePath, string fullClassName, string methodName, params object[] args) { AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationName = "ApplicationLoader"; setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory + @"bin\"; //setup.PrivateBinPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "private"); setup.CachePath = setup.ApplicationBase; setup.ShadowCopyFiles = "true"; if (assemblyConfigFilePath != string.Empty) { setup.ConfigurationFile = AppDomain.CurrentDomain.BaseDirectory + assemblyConfigFilePath; } setup.ShadowCopyDirectories = setup.ApplicationBase; setup.LoaderOptimization = LoaderOptimization.SingleDomain;
this.appDomain = AppDomain.CreateDomain("ApplicationLoaderDomain", null, setup); String name = Assembly.GetExecutingAssembly().GetName().FullName;
this.remoteLoader = (DynamicRemoteLoadAssembly<T>)this.appDomain.CreateInstanceAndUnwrap(name, typeof(DynamicRemoteLoadAssembly<T>).FullName);
assemblyName = AppDomain.CurrentDomain.BaseDirectory + assemblyPath + assemblyName;
return this.remoteLoader.InvokeMethod(assemblyName, fullClassName, methodName, args); }
/// <summary> /// /// </summary> public void Unload() { try { AppDomain.Unload(this.appDomain); this.appDomain = null; } catch (CannotUnloadAppDomainException ex) {
} } } }
using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Globalization;namespace Alif.CommonAPI.DynamicLoadAssembly { public class DynamicRemoteLoadAssembly<T> : MarshalByRefObject { private Assembly assembly = null;
public T InvokeMethod(string assemblyPath, string fullClassName, string methodName, params object[] args) { this.assembly = null; T result = default(T); try { this.assembly = Assembly.LoadFile(assemblyPath); Type pgmType = null; if (this.assembly != null) { pgmType = this.assembly.GetType(fullClassName, true, true); } else { pgmType = Type.GetType(fullClassName, true, true); } BindingFlags defaultBinding = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.InvokeMethod | BindingFlags.Static; CultureInfo cultureInfo = new CultureInfo("es-ES", false); try { MethodInfo methisInfo = assembly.GetType(fullClassName, true, true).GetMethod(methodName);
if (methisInfo == null) { new Exception("EMethod does not exist!"); }
if (methisInfo.IsStatic) { if (methisInfo.GetParameters().Length == 0) { if (methisInfo.ReturnType == typeof(void)) { pgmType.InvokeMember(methodName, defaultBinding, null, null, null, cultureInfo); } else { result = (T)pgmType.InvokeMember(methodName, defaultBinding, null, null, null, cultureInfo); } } else { if (methisInfo.ReturnType == typeof(void)) { pgmType.InvokeMember(methodName, defaultBinding, null, null, args, cultureInfo); }
else { result = (T)pgmType.InvokeMember(methodName, defaultBinding, null, null, args, cultureInfo); } } } else {
if (methisInfo.GetParameters().Length == 0) { object pgmClass = Activator.CreateInstance(pgmType); if (methisInfo.ReturnType == typeof(void)) { pgmType.InvokeMember(methodName, defaultBinding, null, pgmClass, null, cultureInfo); } else { result = (T)pgmType.InvokeMember(methodName, defaultBinding, null, pgmClass, null, cultureInfo); } } else { object pgmClass = Activator.CreateInstance(pgmType); if (methisInfo.ReturnType == typeof(void)) { pgmType.InvokeMember(methodName, defaultBinding, null, pgmClass, args, cultureInfo); } else { result = (T)pgmType.InvokeMember(methodName, defaultBinding, null, pgmClass, args, cultureInfo); } } } } catch (Exception e) { result = (T)pgmType.InvokeMember(methodName, defaultBinding, null, null, null, cultureInfo); } return result; } catch (Exception ee) { return result; } } } }
希望本文所述对大家的C#程序设计有所帮助。