动态加载和卸载 DLL
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ClassLibrary1 { public class Class1 { public static void DoStuff(string msg) { Console.WriteLine("Class1.DoStuff: " + msg); } } }
上面是调用的DLL源码
调用主程序源码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { AppDomain ad = AppDomain.CreateDomain("Test"); // Loader lives in another AppDomain Loader loader = (Loader)ad.CreateInstanceAndUnwrap( typeof(Loader).Assembly.FullName, typeof(Loader).FullName); loader.LoadAssembly(@"..\..\..\ClassLibrary1\bin\Debug\ClassLibrary1.dll"); loader.ExecuteStaticMethod( "ClassLibrary1.Class1", "DoStuff", DateTime.Now.ToShortDateString()); AppDomain.Unload(ad); Console.ReadLine(); } class Loader : MarshalByRefObject { private Assembly _assembly; public override object InitializeLifetimeService() { return null; } public void LoadAssembly( string path ) { _assembly = Assembly.Load( AssemblyName.GetAssemblyName( path ) ); } public object ExecuteStaticMethod( string typeName, string methodName, params object[] parameters ) { Type type = _assembly.GetType( typeName ); // TODO: this won't work if there are overloads available MethodInfo method = type.GetMethod( methodName, BindingFlags.Static | BindingFlags.Public ); return method.Invoke( null, parameters ); } } } }