Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 59779|Jawab: 9

[Sumber] "Penggantian Dinamis" untuk Plugin .NET

[Salin tautan]
Dipaparkan pada 2021-8-15 21:55:14 | | |
Bayangkan skenario di mana sistem layanan kami menyediakan serangkaian layanan fungsional, dan lebih banyak layanan fungsional baru akan ditambahkan di masa mendatang, dan layanan fungsional mungkin perlu diubah atau dihapus. Persyaratan dasar umum untuk sistem layanan semacam itu adalah bahwa pengoperasian sistem layanan tidak dapat dihentikan saat menambahkan/menghapus/memperbarui layanan fungsional. Biasanya, "plugin hot-swapping" dapat diimplementasikan dengan sangat mudah dengan merangkum setiap layanan ke dalam dll plugin, tetapi "penggantian panas" ("penggantian dinamis") plugin menjadi masalah. Alasannya adalah ketika kita menghapus plugin Dll dari sistem layanan, sistem layanan sebenarnya masih memegang referensi yang mendasari dll, dan jika Anda mencoba menghapus atau menimpa dll, windows akan memberikan pesan seperti "dll sedang digunakan".

Jadi bagaimana mengatasi masalah ini? Saya pikir setidaknya ada dua opsi:

(1) Gunakan AppDomain. Memuat plugin di AppDomain baru dan kemudian menghapus AppDomain dengan bersih membongkar dll plugin dari sistem layanan. Kelemahan dari pendekatan ini adalah Anda perlu mengelola banyak AppDomains (karena Anda memiliki begitu banyak layanan fungsional), dan komunikasi di seluruh AppDomains dilakukan dengan cara jarak jauh, yang menimbulkan banyak sakit kepala yang tidak perlu ke sistem kami. Jika Anda tertarik, Anda juga dapat mencoba opsi ini, dan saya lebih suka menggunakan yang kedua.

(2) Salin plugin Dll di memori, lalu muat Dll di memori. Dengan cara ini, DLL pada hard drive dapat ditimpa atau dihapus sesuka hati. Sebelumnya kami memuat plugin Dll langsung dari hard drive, seperti ini:

Sekarang, kita perlu berbelok di sudut:


Ini memecahkan masalah "penggantian dinamis" plugin.





Mantan:Spring Cloud mencatat semua log antarmuka permintaan ke MongoDB
Depan:.NET/C# mengonversi nama bidang yang digarisbawahi menjadi formulir punuk besar
Dipaparkan pada 2021-8-15 23:11:28 |
Proyek sebesar itu, lebih baik me-restart server di malam hari ...
Dipaparkan pada 2021-8-17 14:43:41 |
Terima kasih telah berbagi!~'
Dipaparkan pada 2021-9-16 18:25:58 |
Respons pengujian
Dipaparkan pada 2021-9-17 21:39:18 |
Belajar
Dipaparkan pada 2021-9-18 19:05:29 |
Posting ini terakhir diedit oleh fyxh66 pada 2021-9-18 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 juga mencoba, tidak ada @小slag Bos punya waktu untuk membantu melihatnya
 Tuan tanah| Dipaparkan pada 2021-9-18 22:08:32 |
fyxh66 dipaparkan pada 2021-9-18 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Belum mengalami masalah ini.

Ada dua situasi di mana pengecualian System.BadImageFormatException terjadi: platform target program tidak konsisten > platform sistem file dll referensi tidak konsisten.

Periksa: Apakah versi .NET dari program utama dan dll-in plug-in konsisten, dan platform target konsisten, atau apakah dlli tidak dikembangkan di .net?
Dipaparkan pada 2021-9-19 16:17:56 |
Diterbitkan pada 2021-9-18 22:08
Belum mengalami masalah ini.

Ada dua situasi ketika pengecualian System.BadImageFormatException terjadi: platform target program tidak konsisten > referensi dll ...

Ya, c++ dll...
 Tuan tanah| Dipaparkan pada 2021-9-19 17:01:33 |

Itu jelas tidak bagus, plugin dinamis di sini hanya dapat memuat DLL .NET, dan DLL yang memanggil C++ tidak disesuaikan dengan cara ini
Dipaparkan pada 2021-9-19 18:54:53 |
Xiaozha Dipaparkan pada 2021-9-19 17:01
Itu jelas tidak bagus, plugin dinamis di sini hanya dapat memuat DLL .net, dan DLL yang memanggil C++ tidak disetel seperti ini...

Apakah ada cara untuk memanggil dll di C++ dengan langsung menggunakan byte[] byteset dll untuk memanggil metode di dalamnya?
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com