Notas de estudio de actualización multiplataforma y actualización de Unity (1)

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

 

Supongo que te gusta

Origin www.cnblogs.com/luguoshuai/p/12748215.html
Recomendado
Clasificación