Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 59779|Respuesta: 9

[Fuente] "Reemplazo dinámico" para plugins .NET

[Copiar enlace]
Publicado el 15-8-2021 21:55:14 | | |
Imagina un escenario en el que nuestro sistema de servicios proporciona una serie de servicios funcionales, y en el futuro se añadirán más servicios funcionales nuevos, y los servicios funcionales podrían necesitar ser modificados o eliminados. Un requisito básico común para este tipo de sistema de servicios es que el funcionamiento del sistema de servicios no pueda detenerse al añadir, eliminar o actualizar servicios funcionales. Normalmente, los "plugins de intercambio en caliente" pueden implementarse muy fácilmente encapsulando cada servicio en una dll de plugins, pero el "reemplazo en caliente" ("reemplazo dinámico") de plugins se convierte en un problema. La razón es que cuando desinstalamos una DLL de plugin del sistema de servicio, el sistema de servicio en realidad sigue manteniendo la referencia subyacente a la DLL, y si intentas borrar o sobrescribir la DLL, Windows mostrará un mensaje como "la dll está siendo utilizada".

¿Cómo resolver este problema? Creo que hay al menos dos opciones:

(1) Utilizar AppDomain. Cargar plugins en un nuevo AppDomain y luego desinstalar el AppDomain descarga limpiamente las DLLs de plugins del sistema de servicio. La desventaja de este enfoque es que necesitas gestionar muchos AppDomaines (porque tienes tantos servicios funcionales), y la comunicación entre AppDomaines se realiza de forma remota, lo que introduce muchos quebraderos de cabeza innecesarios a nuestro sistema. Si te interesa, también puedes probar esta opción, y yo prefiero usar la segunda.

(2) Copiar la DLL del plugin en memoria y luego cargar la DLL en memoria. De este modo, las DLL del disco duro pueden ser sobrescritos o eliminados a voluntad. Anteriormente cargamos el plugin Dll directamente desde el disco duro, así:

Ahora, tenemos que dar un giro:


Esto resuelve el problema de la "sustitución dinámica" de plugins.





Anterior:Spring Cloud registra todos los registros de la interfaz de solicitudes en MongoDB
Próximo:.NET/C# convierte los nombres de campos subrayados en formas de joroba grande
Publicado el 15-8-2021 23:11:28 |
Un proyecto tan grande, es mejor reiniciar el servidor por la noche...
Publicado el 17-8-2021 14:43:41 |
¡Gracias por compartir!~'
Publicado el 16-9-2021 18:25:58 |
Respuestas en pruebas
Publicado el 17-9-2021 21:39:18 |
Apréndelo
Publicado el 18-09-2021 19:05:29 |
Esta publicación fue editada por última vez por fyxh66 el 18-9-2021 a las 19:07

System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。”IL 格式不正确。
  • var dll = Assembly.Load(addinStream);
86 también lo intentó, sin @小slag El jefe tiene tiempo para ayudar a echar un vistazo
 Propietario| Publicado el 18-09-2021 22:08:32 |
FYXH66 publicado el 18-9-2021 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

No me he encontrado con este problema.

Hay dos situaciones en las que ocurre la excepción System.BadImageFormatException: la plataforma destino del programa es inconsistente > la plataforma del sistema del archivo dll de referencia es inconsistente.

Comprobación: ¿Son consistentes las versiones .NET del programa principal y las DLLs del complemento, y la plataforma de destino, o las DLLs no se desarrollan en .net?
Publicado el 19-9-2021 16:17:56 |
Publicado el 18-9-2021 a las 22:08
No me he encontrado con este problema.

Hay dos situaciones en las que ocurre la excepción System.MalaImagenFormatoExcepción: la plataforma destino del programa es inconsistente > la referencia dll ...

Sí, la dll de C++...
 Propietario| Publicado el 19-09-2021 17:01:33 |

Eso definitivamente no es bueno, el plugin dinámico aquí solo puede cargar DLLs .NET, y las DLLs que llaman a C++ no se ajustan de esta manera
Publicado el 19-9-2021 18:54:53 |
Xiaozha Publicado el 2021-9-19 17:01
Eso definitivamente no es bueno, el plugin dinámico aquí solo puede cargar DLLs .net, y las DLLs que llaman a C++ no están ajustadas así...

¿Hay alguna forma de llamar a la dll en C++ usando directamente el byteset de byte[] de la dll para llamar a los métodos internos?
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com