Em C #, o carregamento e descarregamento dinâmico da DLL é realizado através do domínio do programa.
Crie um programa de console em C #, a estrutura do projeto é a seguinte:
HotUpdate é um aplicativo de console, CommonLib e MoudleAdditive são duas bibliotecas de classes.
Código no CommonLib:
1 usando System; 2 3 namespace CommonLib 4 { 5 interface pública ICalculater 6 { 7 int Calculator ( int a, int b); 8 } 9 }
Código no MoudleAdditive:
1 usando CommonLib; 2 usando sistema; 3 4 namespace MoudleAdditive 5 { 6 classe pública MoudleAdditive: MarshalByRefObject, ICalculater 7 { 8 public int Calculador ( int a, int b) 9 { 10 int res = a + b; 11 Console.WriteLine ( " 结果 结果: " + res + " [Domínio Atual: " + AppDomain.CurrentDomain.FriendlyName + " ] " ); 12 retorno res; 13 } 14 } 15 }
Código no HotUpdate:
1 usando CommonLib; 2 usando System; 3 usando System.IO; 4 5 namespace HotUpdate 6 { 7 class Program 8 { 9 static void Main ( string [] args) 10 { 11 Console.WriteLine ( " Domínio Atual: " + AppDomain. CurrentDomain.FriendlyName + Environment.NewLine); 12 Console.WriteLine ( " Digite dois números (a, b), resultado do 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 addiveDomain = AppDomain.CreateDomain ( " Domain #Calculater " ); 19 Calculador ICalculater = (ICalculater) aditivoDomain.CreateInstanceAndUnwrap ( " MoudleAdditive " , " MoudleAdditive.MoudleAdditive" ); 20 calculater.Calculater (a, b); 21 22 Console.WriteLine ( " Digite sair para sair, digite delete para excluir o AppDomain atual, insira recarregar para recarregar AppDomain " ); 23 comando de string ; 24 while ((command = Console. ReadLine (). ToLower ())! = " Sair " ) 25 { 26 switch (comando) 27 { 28 case " delete " : 29 TryDelete ( " MoudleAdditive.dll "); 30 Console.WriteLine (); 31 intervalos ; 32 case " unload " : 33 UnloadDomain (aditivoDomain); 34 Console.WriteLine (); 35 intervalos ; 36 caso " recarregar " : 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 intervalos ; 45 padrão : 46 intervalos ; 47 } 48 } 49 50 Console.ReadKey (); 51 } 52 53 static void TryDelete ( string filename) 54 { 55 try 56 { 57 string fullName = AppDomain.CurrentDomain.BaseDirectory + filename; 58 File.Delete (fullName); 59 Console.WriteLine ( " Arquivo excluído com êxito: {0} " , fullName) ; 60 } 61 catch (Exceção e) 62 { 63 Console.WriteLine ( "O arquivo de exclusão: {0} falhou, {1} " , nome do arquivo, e.Message); 64 } 65 } 66 67 static void UnloadDomain (AppDomain appDomain) 68 { 69 if ( null == appDomain) retorna ; 70 string appDomainName = appDomain.FriendlyName; 71 AppDomain.Unload (appDomain); 72 Console.WriteLine ( " 卸载 程序 域 {0} 成功! " , AppDomainName); 73 } 74 75 bool estático ReloadDomain ( fora AppDomain appDomain) 76 { 77 tente 78 { 79 appDomain = AppDomain.CreateDomain ( " Domain #Calculater " ); 80 Console.WriteLine ( " Domínio recarregado, nome: Domínio #Calculater " ); 81 retornar verdadeiro ; 82 } 83 captura 84 { 85 appDomain = null ; 86 retornar falso ; 87 } 88 } 89 } 90 }
Para obter princípios detalhados, consulte: https://www.cnblogs.com/Leo_wl/p/4255533.html