Mengganti file .dll saat aplikasi sedang berjalan?


18

Saya memiliki beberapa server permainan yang menggunakan file .dll tertentu untuk dijalankan. Kadang-kadang saya perlu memperbarui server game tetapi saya tidak ingin mengganggu permainan yang sudah berjalan.

Apakah ada cara untuk mengganti file .dll (dikunci oleh Windows) sehingga contoh server game berikutnya yang menggunakan file itu membuka versi baru, dan yang lama tetap menggunakan versi lama dari .dll sampai mereka dimulai ulang ?

Apakah aman hanya membuka kunci file menggunakan salah satu alat yang melakukan itu dan menggantinya?


Mungkin bukan gim Anda. Namun Chrome tidak memperbarui tanpa mengganggu proses Anda. Sayangnya, ini adalah aplikasi-spesifik. (Pergi ke %LocalAppData%\Google\Chrome\Applicationdan Anda akan melihat folder seperti 26.0.1410.64yang menyimpan DLL dari berbagai versi)
Alvin Wong

Tergantung pada perangkat lunak yang dimaksud, dimungkinkan untuk menginstal dan menjalankan dua atau lebih instance yang berbeda (di lokasi yang berbeda). Tidak efisien, tetapi mungkin bisa diterapkan.
Harry Johnston

Jawaban:


23

Sebenarnya, Anda bisa dan biasanya berfungsi tanpa masalah (walaupun tidak selalu)

Apa yang Anda lakukan adalah mengubah nama file tanpa memindahkannya dan memindahkan file baru di atasnya. Itu akan membuat pegangan ke file yang valid dan berfungsi sehingga instance yang sudah ada masih akan dapat mengakses file dengan benar dan instance baru (atau pegangan baru) akan pergi ke file baru.

Jelas, jika suatu program membuka kembali file dll yang sama dan mengharapkannya tetap sama persis (misalnya, jika ada sumber daya yang akan dimuat dari dll dan bahwa referensi ke sumber daya ini diekstraksi dari kode yang berjalan ketika dll dimuat ), ini akan menyebabkan masalah tetapi ini jelas bukan norma.


11

Tidak. Meskipun DLL mungkin sepenuhnya dipetakan ke dalam memori fisik saat aplikasi berjalan, pasti tidak ada jaminan itu. Sebagian DLL (dan bahkan yang dapat dieksekusi) dapat dipetakan ke dalam RAM sementara bit lainnya tetap di disk, dan dapat dibaca di lain waktu.

Mengubah file pada disk sementara Windows memiliki bit-bit yang dipetakan dalam RAM tidak akan berakhir dengan baik. Windows menguncinya untuk alasan yang baik.

Sunting: Saya perlu mengklarifikasi sesuatu karena beberapa orang tampaknya berniat menyalahkan Windows untuk apa yang sebenarnya merupakan masalah desain aplikasi , bukan masalah desain OS.

Anda dapat memperbarui DLL yang digunakan aplikasi di Windows tanpa menghentikan prosesnya, tetapi aplikasi tersebut harus ditulis sedemikian rupa sehingga dapat ditandai untuk membongkar perakitan, menunggu pembaruan selesai, lalu muat ulang DLL. Ini tidak ada hubungannya dengan OS yang Anda jalankan. Ini masalah desain aplikasi.

Edit: Juga lihat jawaban Stephane untuk kemungkinan solusi yang kekuatan kerja, tergantung pada bagaimana Anda merespon aplikasi khusus untuk DLL yang berubah. Saya pikir dia layak mendapatkan suara positif.


Apakah ada cara untuk memindahkan file itu ke lokasi sementara sehingga dapat dihapus nanti, sambil meletakkan yang baru di lokasi yang lama (jadi server yang memulai setelah itu akan menggunakan dll baru)? Atau apakah pegangan file terkait dengan lokasi file?

Itu sepenuhnya tergantung pada bagaimana aplikasi ditulis / bagaimana menggunakan DLL. Lihatlah jawaban Greg Askew. Jika pegangan file terbuka, tidak banyak yang dapat Anda lakukan. Anda dapat menutup gagang file dengan paksa tetapi Anda hampir pasti akan merusak setidaknya aplikasi Anda, jika tidak seluruh OS.
Ryan Ries

Jadi apa “alasan bagus” ini? Sejauh ini jawaban Anda tidak mengandung alasan kuat mengapa Microsoft tidak menawarkan kemampuan hot-swapping.
Konrad Rudolph

2

Tidak, Anda tidak harus mengotak-atik file yang ada.

Jika Anda dapat mengendalikan pemuatan majelis, dan menentukannya dibuka dengan FileShare.Delete, maka Anda harus mengubah nama. Proses yang ada akan terus merujuk pada rakitan yang diganti nama.

/programming/7147577/programmatically-rename-open-file-on-windows .


2
Dalam pengalaman saya, dalam kebanyakan kasus (well, lebih dari separuh waktu, bagaimanapun) Anda dapat mengganti nama (tetapi tidak menghapus) sebuah DLL tanpa bermain-main dengan aplikasi.
Harry Johnston

@ HarryJohnston: Ya sepertinya saya bisa mengganti nama .dll bahkan jika sedang digunakan. Saya kira saya akan melakukannya mulai sekarang.

1

Tidak, sayangnya itu tidak mungkin.

Maaf, tepatnya kecuali ada ikatan yang terlambat, artinya aplikasi menggunakan dll ketika menjalankan beberapa bagian kode dll, tetapi masih tidak dapat diandalkan.


1

Anda bisa melihat bagaimana proses host asp.net bekerja dan mengembangkan sesuatu yang serupa.

Dibutuhkan seluruh aplikasi web dan memindahkannya ke lokasi sementara dari mana aplikasi itu sebenarnya dimuat. Kemudian ia meninggalkan proses untuk memantau perubahan di folder asli, ketika terdeteksi, ia memutar instance baru aplikasi di lokasi sementara baru dan mulai mengarahkan permintaan baru ke aplikasi itu. Aplikasi lama kemudian dirobohkan begitu permintaan yang tertunda selesai.

(Nitpicking, ya, ini adalah pandangan yang disederhanakan, dalam banyak kasus IIS mengantri permintaan sampai aplikasi baru dapat mengambil alih)



0

Pemasang NSIS memiliki satu opsi sebagai Pindah ke Temp pada Machine Restart, OS menandai beberapa file untuk pindah ke lokasi berbeda pada boot berikutnya, pada mesin berikutnya boot file-file yang ditandai ini secara otomatis pindah ke lokasi baru yang Anda pilih sebelumnya. Sedikit pencarian akan membuat Anda bahagia dalam hal ini.


Anda dapat memberikan jawaban lengkap dalam balasan Anda alih-alih memberi tahu OP untuk mencari solusi. Dia tidak akan berada di sini bertanya apakah dia sudah menemukan solusi. Terima kasih.
John aka hot2use
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.