Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 59779|Yanıt: 9

[Kaynak] .NET Eklentileri için "Dinamik Değişim"

[Bağlantıyı kopyala]
2021-8-15 tarihinde yayınlandı 21:55:14 | | |
Hizmet sistemimizin bir dizi fonksiyonel hizmet sağladığını, gelecekte daha fazla yeni fonksiyonel hizmetin ekleneceğini, fonksiyonel hizmetlerin değiştirilebileceğini veya kaldırılabileceğini hayal edin. Böyle bir hizmet sistemi için yaygın temel gereksinim, fonksiyonel hizmetler eklenir/kaldırılırken/güncellenirken hizmet sisteminin işleyişinin durdurulamamasıdır. Genellikle, "sıcak değiştirme eklentileri" her hizmeti bir eklenti dll'sine kapsülleyerek çok kolay uygulanabilir, ancak eklentilerin "sıcak değişimi" ("dinamik değişim") bir sorun haline gelir. Bunun nedeni, bir eklenti DLL'yi hizmet sisteminden kaldırdığımızda, hizmet sistemi aslında dll'nin temel referansını hâlâ elinde tutuyor ve dll'yi silmeye veya üzerine yazmaya çalıştığınızda Windows "dll kullanılıyor" gibi bir mesaj veriyor.

Peki bu sorunu nasıl çözebiliriz? Bence en az iki seçenek var:

(1) AppDomain kullanın. Eklentileri yeni bir AppDomain'e yükleyip ardından AppDomain'i kaldırmak, eklenti dll'lerini hizmet sisteminden temiz şekilde kaldırır. Bu yaklaşımın dezavantajı, birçok AppDomain'i yönetmeniz gerektiği (çünkü çok sayıda işlevsel hizmetiniz var) ve AppDomain'ler arasında iletişimin uzaktan yapılmasıdır, bu da sistemimize gereksiz birçok sorun getiriyor. İlgileniyorsanız bu seçeneği de deneyebilirsiniz, ben ise ikinciyi tercih ediyorum.

(2) Eklenti Dll'yi belleğe kopyalayın ve ardından Dll'yi belleğe yükleyin. Bu şekilde, sabit diskteki DLL'ler istediğim zaman üzerine yazılabilir veya silinebilir. Daha önce eklenti DLL'yi doğrudan sabit diskten yüklerdik, şöyle:

Şimdi, bir köşeye dönmemiz gerekiyor:


Bu, eklentilerin "dinamik değişimi" sorununu çözer.





Önceki:Spring Cloud, tüm istek arayüz loglarını MongoDB'ye kaydeder
Önümüzdeki:.NET/C#, altı çizgili alan isimlerini büyük hump formlarına dönüştürür
2021-8-15 tarihinde yayınlandı 23:11:28 |
Bu kadar büyük bir proje, sunucuyu gece yeniden başlatmak daha iyi...
2021-8-17 tarihinde 14:43:41 tarihinde yayınlandı |
Paylaştığın için teşekkürler!~'
2021-9-16 tarihinde 18:25:58 tarihinde yayınlandı |
Test yanıtları
2021-9-17 tarihinde 21:39:18 tarihinde yayınlandı |
Öğren
2021-9-18 tarihinde 19:05:29 tarihinde yayınlandı |
Bu gönderi en son fyxh66 tarafından 2021-9-18 19:07 tarihinde düzenlenmiştir

System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。”IL 格式不正确。
  • var dll = Assembly.Load(addinStream);
86 da denedi, @小slag Patronun bakmaya vakti var
 Ev sahibi| 2021-9-18 tarihinde yayınlandı 22:08:32 |
fyxh66 2021-09-18 19:05 tarihinde yayınlandı
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Bu sorunla karşılaşmadım.

System.BadImageFormatException istisnasının meydana geldiği iki durum vardır: programın hedef platformu tutarsız > referans dll dosyasının sistem platformu tutarsızdır.

Kontrol et: Ana program ve eklenti dll'lerinin .NET sürümleri tutarlı, hedef platform da tutarlı mı, yoksa dll'ler .net üzerinde geliştirilmemiş mi?
2021-9-19 tarihinde 16:17:56 tarihinde yayınlandı |
2021-9-18 22:08 tarihinde yayımlandı
Bu sorunla karşılaşmadım.

System.BadImageFormatException istisnasının meydana geldiği iki durum vardır: program hedef platformu referans dll > tutarsızdır ...

Evet, c++ dll...
 Ev sahibi| 2021-9-19 tarihinde 17:01:33 tarihinde yayınlandı |

Bu kesinlikle iyi değil, burada dinamik eklenti sadece .NET DLL'leri yükleyebiliyor ve C++ çağıran DLL'ler bu şekilde ayarlanmıyor
2021-9-19 tarihinde 18:54:53 tarihinde yayınlandı |
Xiaozha 2021-9-19 17:01 tarihinde yayınlandı
Bu kesinlikle iyi değil, buradaki dinamik eklenti sadece .net DLL'leri yükleyebiliyor ve C++ çağıran DLL'ler bu şekilde ayarlanmamış...

C++ dilinde dll'yi doğrudan dll'nin bayt[] baytını kullanarak içindeki metotları çağırmanın bir yolu var mı?
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com