Uygulama çalışırken .dll dosyaları değiştirilsin mi?


18

Çalıştırmak için belirli bir .dll dosyasını kullanan birkaç oyun sunucum var. Bazen oyun sunucularını güncellemem gerekiyor, ancak zaten çalışmakta olan oyunları kesmek istemiyorum.

.Dll dosyasını (Windows tarafından kilitlenir) değiştirmenin bir yolu var mı, bu nedenle bu dosyayı kullanan oyun sunucularının sonraki örnekleri yeni sürümü açıyor ve eskileri yeniden başlatılana kadar bu .dll dosyasının eski sürümünü kullanmaya devam ediyor ?

Bunu yapan ve değiştiren araçlardan birini kullanarak dosyanın kilidini açmak güvenli midir?


Belki senin oyunun değil. Ancak Chrome , işleminizi kesintiye uğratmadan güncellenir. Ne yazık ki, bu uygulamaya özgüdür. (Git %LocalAppData%\Google\Chrome\Applicationve 26.0.1410.64farklı sürümlerin DLL'lerini saklayan klasörler görmelisin )
Alvin Wong

Söz konusu yazılıma bağlı olarak, iki veya daha fazla farklı örneği (farklı konumlarda) kurmak ve çalıştırmak mümkün olabilir. Verimsiz, ama belki de uygulanabilir.
Harry Johnston

Yanıtlar:


23

Aslında, yapabilirsiniz ve genellikle herhangi bir sorun olmadan çalışır (her zaman olmasa da)

Yapmanız gereken dosyayı taşımadan yeniden adlandırmak ve yeni dosyayı üzerine taşımaktır. Bu, dosyadaki tanıtıcıları geçerli ve çalışır durumda tutar, böylece önceden var olan örnekler yine de dosyaya düzgün bir şekilde erişebilir ve yeni örnekler (veya yeni tanıtıcılar) yeni dosyaya gider.

Açıkçası, bir program aynı dll dosyasını yeniden açar ve tam olarak aynı kalmasını beklerse (örneğin, dll'den yüklenecek kaynaklar varsa ve bu kaynaklara yapılan başvurular dll yüklendiğinde çalışan koddan çıkarılır) ), bu soruna neden olur, ancak bu kesinlikle norm değildir.


11

Hayır bir DLL olsa olabilir uygulaması çalıştığında, kesinlikle bunun garantisi yoktur iken tamamen fiziksel belleğe eşleştirilemediğinde. DLL bölümleri (ve hatta yürütülebilir dosyalar) diğer bitleri diskte kalırken RAM ile eşlenebilir ve daha sonra okunabilir.

Windows bitleri RAM ile eşlenmişken diskteki dosyayı değiştirmek iyi sonuç vermez. Windows bunu iyi bir nedenden dolayı kilitler.

Düzenleme: Bazı insanlar bir işletim sistemi tasarım sorunu değil , aslında bir uygulama tasarım sorunu ne için Windows suçlama niyetinde gibi görünüyor bir şey açıklığa kavuşturmak gerekiyor .

Uygulamaların işlemi sonlandırmadan Windows'da kullandığı DLL'leri güncelleştirebilirsiniz, ancak uygulama, derlemeyi kaldırmak, güncellemenin bitmesini beklemek ve daha sonra DLL'i yeniden yüklemek için sinyal verilebilecek şekilde yazılmalıdır. Bunun çalıştırdığınız işletim sistemi ile ilgisi yoktur. Bu bir uygulama tasarımı sorunudur.

Düzenleme: Ayrıca için Stephane'ın cevaba bakınız olası çözümde de kudreti çalışması, nasıl onun DLL için özel uygulama yanıt verir değişen bağlı. Bence bir oyu hak ediyor.


Eski dosyayı yeni bir dosya yerleştirerek (daha sonra başlayan sunucular yeni dll kullanır) böylece daha sonra silinebilir böylece bu dosyayı geçici bir konuma taşımak için herhangi bir yolu var mı? Veya dosya tanıtıcısı dosya konumuna bağlı mı?

Bu tamamen uygulamanın nasıl yazıldığına / DLL'leri nasıl kullandığına bağlıdır. Greg Askew'in cevabına bir göz atın. Dosya tanıtıcısı açıksa, bu konuda yapabileceğiniz çok şey yoktur. Dosya tanıtıcısını zorla kapatabilirsiniz, ancak tüm işletim sistemi olmasa bile, en azından uygulamanızı neredeyse kesinlikle kilitlersiniz.
Ryan Ries

Peki bu “iyi sebep” nedir? Şimdiye kadar yanıtınız, Microsoft'un çalışırken değiştirme yeteneği sunmamasının zorlayıcı bir nedenini içermiyor.
Konrad Rudolph

2

Hayır, mevcut dosya tanıtıcılarıyla uğraşmamalısınız.

Derlemenin yüklenmesini denetleyebilir ve FileShare.Delete ile açıldığını belirtebilirseniz, yeniden adlandırmak mümkün olmalıdır. Mevcut işlemler, yeniden adlandırılan derlemeye başvurmaya devam edecektir.

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


2
Benim durumumda, çoğu durumda (iyi, yarıdan fazla, herhangi bir oranda) bir DLL uygulaması ile herhangi bir müdahalesi olmadan yeniden adlandırabilir (ancak silebilir).
Harry Johnston

@HarryJohnston: Evet, kullanımda olsa bile .dll'yi yeniden adlandırabilirim. Sanırım bundan sonra yapacağım.

1

Hayır, maalesef mümkün değil.

Üzgünüm, geç bağlama olmadığı sürece kesin olmak gerekirse, yani uygulama o dll kodun bir kısmını çalıştırdığında o dll kullanır, ancak yine de güvenilir değildir.


1

Asp.net barındırılan sürecin nasıl çalıştığına bakabilir ve benzer bir şey geliştirebilirsiniz.

Tüm web uygulamasını alır ve uygulamanın yüklendiği geçici bir konuma taşır. Daha sonra orijinal klasördeki değişiklikleri izlemek için bir işlem bırakır, algılandığında, uygulamanın yeni bir örneğini yeni bir geçici konumda döndürür ve yeni istekleri o uygulamaya yönlendirmeye başlar. Bekleyen istekler tamamlandıktan sonra eski uygulama yırtılır.

(Nitpicking, evet, bu şeylerin basitleştirilmiş bir görünümüdür, çoğu durumda IIS yeni uygulama devralıncaya kadar istekleri sıralar)



0

NSIS Installer, Makine Yeniden Başlatma Sırasında Sıcama Taşı olarak bir seçeneğe sahiptir, OS, bir sonraki önyüklemede farklı bir konuma taşımak için bazı dosyaları işaretler, bir sonraki makine önyüklemesinde bu işaretli dosyalar otomatik olarak daha önce seçtiğiniz yeni konuma taşınır. Bununla ilgili küçük bir araştırma sizi bu konuda mutlu edecektir.


OP'ye bir çözüm aramasını söylemek yerine cevabınızda tam bir cevap verebilirsiniz. Burada bir çözüm bulup bulamadığını sormayacaktı. Teşekkürler.
John aka hot2use
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.