En C #, la carga y descarga dinámica de DLL se realiza a través del dominio del programa.
Cree un programa de consola C #, la estructura del proyecto es la siguiente:
HotUpdate es una aplicación de consola, CommonLib y MoudleAdditive son bibliotecas de dos clases.
Código en CommonLib:
1 usando el sistema; 2 3 espacio de nombres CommonLib 4 { 5 interfaz pública ICalculater 6 { 7 int Calculator ( int a, int b); 8 } 9 }
Código en MoudleAdditive:
1 usando CommonLib; 2 usando el sistema; 3 4 espacio de nombres MoudleAdditive 5 { 6 public class MoudleAdditive: MarshalByRefObject, ICalculater 7 { 8 public int Calculator ( int a, int b) 9 { 10 int res = a + b; 11 Console.WriteLine ( " 相加 结果: " + res + " [Dominio actual: "+ AppDomain.CurrentDomain.FriendlyName + " ] " ); 12 devoluciones res; 13 } 14 } 15 }
Código en HotUpdate:
1 usando CommonLib; 2 usando System; 3 usando System.IO; 4 5 espacio de nombres HotUpdate 6 { 7 class Program 8 { 9 static void Main ( string [] args) 10 { 11 Console.WriteLine ( " Current Domain: " + AppDomain. CurrentDomain.FriendlyName + Environment.NewLine); 12 Console.WriteLine ( " Ingrese dos números (a, b), resultado del cálculo: " ); 13 Console.Write ( " a = " ); 14 int a = Convert.ToInt32 (Console.ReadLine ()); 15 Console.Write ( " b = " ); 16 int b = Convert.ToInt32 (Console.ReadLine ()); 17 18 AppDomain additiveDomain = AppDomain.CreateDomain ( " Domain #Calculater " ); 19 Calculadora ICalculater = (ICalculater) additiveDomain.CreateInstanceAndUnwrap ( " MoudleAdditive " , " MoudleAdditive.MoudleAdditive" ); Calculadora 20. Calculadora (a, b); 21 22 Console.WriteLine ( " Ingrese salir para salir, ingrese eliminar para eliminar el AppDomain actual, ingrese reload para recargar AppDomain " ); 23 comando de cadena ; 24 while ((command = Console. ReadLine (). ToLower ())! = " Salir " ) 25 { 26 switch (comando) 27 { 28 case " delete " : 29 TryDelete ( " MoudleAdditive.dll "); 30 Console.WriteLine (); 31 descanso ; 32 caso " descargar " : 33 UnloadDomain (additiveDomain); 34 Console.WriteLine (); 35 descanso ; 36 caso " recargar " : 37 AppDomain appDomain; 38 if (ReloadDomain ( out appDomain)) 39 { 40 ICalculater cal = (ICalculater) appDomain.CreateInstanceAndUnwrap ( " MoudleAdditive " , " MoudleAdditive.MoudleAdditive " ); 41 Cal. Calculadora (a, b); 42 } 43 Console.WriteLine (); 44 descanso ; 45 por defecto : 46 descanso ; 47 } 48 } 49 50 Console.ReadKey (); 51 } 52 53 estático vacío TryDelete ( string filename) 54 { 55 try 56 { 57 string fullName = AppDomain.CurrentDomain.BaseDirectory + filename; 58 File.Delete (fullName); 59 Console.WriteLine ( " Archivo eliminado con éxito: {0} " , fullName) ; 60 } 61 catch (Excepción e) 62 { 63 Console.WriteLine ( " Eliminar archivo: {0} falló, {1} " , nombre de archivo, e.Message); 64 } 65 } 66 67 vacío estático UnloadDomain (AppDomain appDomain) 68 { 69 if ( null == appDomain) return ; 70 cadenas appDomainName = appDomain.FriendlyName; 71 AppDomain.Unload (appDomain); 72 Console.WriteLine ( " 卸载 程序 域 {0} 成功! " , AppDomainName); 73 } 74 75 static bool ReloadDomain ( fuera AppDomain appDomain) 76 { 77 prueba 78 { 79 appDomain = AppDomain.CreateDomain ( " Domain #Calculater " ); 80 Console.WriteLine ( " Dominio recargado, nombre: Dominio # Calculadora " ); 81 devuelve verdadero ; 82 } 83 catch 84 { 85 appDomain = null ; 86 devuelve falso ; 87 } 88 } 89 } 90 }
Para conocer los principios detallados, consulte: https://www.cnblogs.com/Leo_wl/p/4255533.html