Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 59779|Odpowiedź: 9

[Źródło] "Dynamiczna zamiennica" dla wtyczek .NET

[Skopiuj link]
Opublikowano 2021-8-15 21:55:14 | | |
Wyobraźmy sobie sytuację, w której nasz system usług dostarcza serię usług funkcjonalnych, a w przyszłości zostaną dodane kolejne nowe usługi funkcjonalne, a usługi funkcjonalne mogą wymagać zmian lub usunięcia. Powszechnym podstawowym wyżem takiego systemu usług jest to, że jego działanie nie może być zatrzymane podczas dodawania/usuwania/aktualizacji usług funkcjonalnych. Zazwyczaj "wtyczki do wymiany na gorąco" można bardzo łatwo zaimplementować, kapsułując każdą usługę w wtyczkę dll, ale problemem staje się "wymiana na gorąco" ("dynamiczna zastępowa") wtyczek. Powód jest taki, że gdy odinstalujemy wtyczkę Dll z systemu usługowego, system serwisowy nadal przechowuje odniesienie do dll, a jeśli spróbujesz usunąć lub nadpisać dll, Windows wyświetla komunikat typu "dll jest używane".

Jak więc rozwiązać ten problem? Myślę, że są co najmniej dwie opcje:

(1) Używaj AppDomain. Załadowanie wtyczek w nowej AppDomain, a następnie odinstalowanie AppDomain czysto usuwa wtyczki dlls z systemu usługowego. Minusem tego podejścia jest to, że musisz zarządzać wieloma AppDomainami (ponieważ masz tak wiele funkcjonalnych usług), a komunikacja między AppDomainami odbywa się zdalnie, co wprowadza wiele niepotrzebnych problemów do naszego systemu. Jeśli jesteś zainteresowany, możesz też spróbować tej opcji, a ja wolę korzystać z drugiej.

(2) Skopiuj wtyczkę Dll w pamięci, a następnie załaduj Dll w pamięci. W ten sposób DLL na dysku twardym mogą być nadpisywane lub usuwane według uznania. Wcześniej ładowaliśmy wtyczkę Dll bezpośrednio z dysku twardego, w ten sposób:

Teraz musimy zmienić sytuację:


To rozwiązuje problem "dynamicznej zastępowania" wtyczek.





Poprzedni:Spring Cloud rejestruje wszystkie logi interfejsu żądań do MongoDB
Następny:.NET/C# konwertuje podkreślone nazwy pól na duże formy garbowe
Opublikowano 2021-8-15 23:11:28 |
Taki duży projekt, lepiej uruchomić serwer wieczorem...
Opublikowano 2021-8-17 14:43:41 |
Dzięki za podzielenie się!~'
Opublikowano 2021-9-16 18:25:58 |
Odpowiedzi testowe
Opublikowano 2021-9-17 21:39:18 |
Naucz się go
Opublikowano 2021-9-18 19:05:29 |
Ten post został ostatnio edytowany przez fyxh66 w dniu 18.09.2021 o 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 też próbował, ale nie @小slag Szef ma czas, żeby pomóc w obejrzeniu
 Ziemianin| Opublikowano 2021-9-18 22:08:32 |
FYXH66 opublikowano 18.09.2021, 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Nie spotkałem się z tym problemem.

Istnieją dwie sytuacje, w których występuje wyjątek System.BadImageFormatException: docelowa platforma programu jest niespójna, > systemowa platforma referencyjnego pliku dll jest niespójna.

Sprawdź: Czy wersje dll-ów głównego programu i wtyczek .NET są spójne, a docelowa platforma spójna, czy też dll-e nie są rozwijane na .net?
Opublikowano 2021-9-19 16:17:56 |
Opublikowano 18 września 2021, 22:08
Nie spotkałem się z tym problemem.

Istnieją dwie sytuacje, gdy występuje wyjątek System.BadImageFormatException: platforma docelowa programu jest niespójna > referencyjnym dll ...

Tak, c++ dll...
 Ziemianin| Opublikowano 2021-9-19 o 17:01:33 |

To zdecydowanie nie jest dobre, dynamiczna wtyczka tutaj może ładować tylko pliki DLL .NET, a DLL wywołujące C++ nie są w ten sposób regulowane
Opublikowano 2021-9-19 o 18:54:53 |
Xiaozha Opublikowano 19.09.2021, 17:01
To zdecydowanie nie jest dobre, dynamiczna wtyczka tutaj może ładować tylko DLL .net, a DLL wywołujące C++ nie są tak dostrojone...

Czy istnieje sposób, aby wywołać dll w C++, bezpośrednio używając bajtowego zestawu bajtów[] dll do wywołania metod w środku?
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com