Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 59779|Resposta: 9

[Fonte] "Substituição dinâmica" para plugins .NET

[Copiar link]
Postado em 2021-8-15 21:55:14 | | |
Imagine um cenário em que nosso sistema de serviços forneça uma série de serviços funcionais, e mais novos serviços funcionais serão adicionados no futuro, e serviços funcionais podem precisar ser alterados ou removidos. Um requisito básico comum para esse tipo de sistema de serviços é que a operação do sistema de serviço não possa ser interrompida ao adicionar/remover/atualizar serviços funcionais. Normalmente, "hot-swapping plugins" podem ser implementados muito facilmente encapsulando cada serviço em uma DLL de plugins, mas a "hot replacement" ("substituição dinâmica") dos plugins se torna um problema. O motivo é que, quando desinstalamos um plugin DLL do sistema de serviço, o sistema de serviço ainda mantém a referência subjacente à DLL, e se você tentar deletar ou sobrescrever a DLL, o Windows vai mostrar uma mensagem como "a DLL está sendo usada".

Então, como resolver esse problema? Acho que existem pelo menos duas opções:

(1) Use AppDomain. Carregar plugins em um novo AppDomain e depois desinstalar o AppDomain descarrega limpamente os plugins DLLs do sistema de serviço. O lado negativo dessa abordagem é que você precisa gerenciar muitos AppDomains (porque você tem muitos serviços funcionais), e a comunicação entre os AppDomaines é feita de forma remota, o que traz muitas dores de cabeça desnecessárias ao nosso sistema. Se você tiver interesse, também pode tentar essa opção, e eu prefiro usar a segunda.

(2) Copiar o plugin Dll na memória e então carregar o Dll na memória. Dessa forma, as DLLs do disco rígido podem ser sobrescrevidas ou excluídas à vontade. Anteriormente, carregávamos o plugin Dll diretamente do disco rígido, assim:

Agora, precisamos virar a página:


Isso resolve o problema da "substituição dinâmica" dos plugins.





Anterior:O Spring Cloud registra todos os logs de interface de requisição no MongoDB
Próximo:.NET/C# converte nomes de campos sublinhados em formas grandes de corcunda
Postado em 15-08-2021 23:11:28 |
Um projeto tão grande, é melhor reiniciar o servidor à noite...
Postado em 2021-8-17 14:43:41 |
Obrigado por compartilhar!~'
Postado em 16-09-2021 18:25:58 |
Respostas nos testes
Postado em 2021-9-17 21:39:18 |
Aprenda
Postado em 2021-9-18 19:05:29 |
Este post foi editado pela última vez por fyxh66 em 18-09-2021 às 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 também tentou, sem @小slag O chefe tem tempo para ajudar a dar uma olhada
 Senhorio| Postado em 2021-9-18 22:08:32 |
FYXH66 Postado em 2021-9-18 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Nunca tive esse problema.

Existem duas situações em que ocorre a exceção System.BadImageFormatException: a plataforma de destino do programa é inconsistente > a plataforma do sistema do arquivo dll de referência é inconsistente.

Confere: As versões .NET do programa principal e das DLLs do plug-in são consistentes, e a plataforma de destino é consistente, ou as DLLs não são desenvolvidas em .net?
Postado em 19-09-2021 às 16:17:56 |
Publicado em 2021-9-18 às 22:08
Nunca tive esse problema.

Existem duas situações em que ocorre a exceção System.BadImageFormatException: a plataforma de alvo do programa é inconsistente > a referência dll ...

Sim, a DLL em C++...
 Senhorio| Postado em 19-09-2021 17:01:33 |

Isso definitivamente não é bom, o plugin dinâmico aqui só pode carregar DLLs .NET, e as DLLs que chamam C++ não são ajustadas dessa forma
Postado em 19-09-2021 às 18:54:53 |
Xiaozha Postado em 2021-9-19 17:01
Isso definitivamente não é bom, o plugin dinâmico aqui só pode carregar DLLs .net, e as DLLs que chamam C++ não são ajustadas assim...

Existe alguma forma de chamar a dll em C++ usando diretamente o byte[] byteset da dll para chamar os métodos internos?
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com