การแทนที่ไฟล์. dll ในขณะที่แอปพลิเคชันทำงานอยู่


18

ฉันมีเซิร์ฟเวอร์เกมหลายตัวที่ใช้ไฟล์. dll ที่แน่นอนเพื่อทำงาน บางครั้งฉันต้องอัปเดตเซิร์ฟเวอร์เกม แต่ฉันไม่ต้องการขัดจังหวะเกมที่ใช้งานอยู่

มีวิธีการแทนที่ไฟล์. dll (ถูกล็อกโดย Windows) ดังนั้นอินสแตนซ์ถัดไปของเซิร์ฟเวอร์เกมที่ใช้ไฟล์นั้นเปิดเวอร์ชันใหม่และไฟล์เก่าจะใช้เวอร์ชั่นเก่าของ. dll นั้นจนกว่าจะรีสตาร์ท ?

ปลอดภัยหรือไม่ที่จะปลดล็อคไฟล์โดยใช้หนึ่งในเครื่องมือเหล่านั้นที่ทำและแทนที่?


อาจไม่ใช่เกมของคุณ อย่างไรก็ตาม Chrome จะอัปเดตโดยไม่ขัดจังหวะกระบวนการของคุณ น่าเสียดายนี่คือแอปพลิเคชันที่เฉพาะเจาะจง (ไป%LocalAppData%\Google\Chrome\Applicationและคุณจะเห็นโฟลเดอร์เช่น26.0.1410.64ร้านค้าที่กำลังรุ่นแตกต่างกัน)
อัลวินวงศ์

อาจเป็นไปได้ที่จะติดตั้งและเรียกใช้อินสแตนซ์ที่แตกต่างกันสองรายการขึ้นไป (ในสถานที่ต่างกัน) ขึ้นอยู่กับซอฟต์แวร์ที่เป็นปัญหา ไม่มีประสิทธิภาพ แต่อาจใช้การได้
Harry Johnston

คำตอบ:


23

ที่จริงแล้วคุณสามารถทำได้และมักจะทำงานได้โดยไม่มีปัญหาใด ๆ (แม้ว่าจะไม่เสมอไป)

สิ่งที่คุณทำคือเปลี่ยนชื่อไฟล์โดยไม่ย้ายและย้ายไฟล์ใหม่ทับ ที่จะทำให้การจัดการกับไฟล์ที่ถูกต้องและทำงานเพื่อให้อินสแตนซ์ที่มีอยู่ก่อนจะยังสามารถเข้าถึงไฟล์ได้อย่างถูกต้องและอินสแตนซ์ใหม่ (หรือที่จับใหม่) จะไปที่ไฟล์ใหม่

เห็นได้ชัดว่าหากโปรแกรมเปิดไฟล์ dll เดียวกันซ้ำอีกครั้งและคาดว่ามันจะเหมือนเดิม (ตัวอย่างเช่นหากมีทรัพยากรที่จะโหลดจาก dll และอ้างอิงถึงทรัพยากรเหล่านี้ถูกดึงออกมาจากรหัสที่ทำงานเมื่อโหลด dll ) สิ่งนี้จะทำให้เกิดปัญหา แต่นี่ไม่ใช่บรรทัดฐาน


11

ไม่แม้ว่า DLL อาจถูกแมปเข้ากับหน่วยความจำกายภาพทั้งหมดในขณะที่แอปพลิเคชันทำงาน แต่ก็ไม่มีการรับประกันใด ๆ บางส่วนของ DLLs (และแม้กระทั่ง executables) สามารถแมปเข้ากับ RAM ในขณะที่บิตอื่น ๆ จะอยู่บนดิสก์และอาจถูกอ่านในภายหลัง

การเปลี่ยนไฟล์บนดิสก์ในขณะที่ Windows มีบิตของมันแมปใน RAM จะไม่จบลงด้วยดี Windows ล็อคด้วยเหตุผลที่ดี

แก้ไข: ฉันต้องชี้แจงบางอย่างเนื่องจากบางคนดูเหมือนเจตนาจะตำหนิ Windows สำหรับสิ่งที่เป็นปัญหาการออกแบบแอปพลิเคชันจริงไม่ใช่ปัญหาการออกแบบระบบปฏิบัติการ

คุณสามารถอัปเดต DLL ที่แอปพลิเคชันใช้ใน Windows ได้โดยไม่ต้องยุติกระบวนการ แต่แอปพลิเคชันนั้นต้องเขียนในลักษณะที่สามารถส่งสัญญาณให้ยกเลิกการโหลดแอสเซมบลีรอให้การอัปเดตเสร็จสิ้นจากนั้นโหลด DLL อีกครั้ง สิ่งนี้ไม่เกี่ยวกับระบบปฏิบัติการที่คุณใช้งาน มันเป็นปัญหาการออกแบบแอปพลิเคชัน

แก้ไข: ดูคำตอบของ Stephane สำหรับวิธีแก้ปัญหาที่อาจเป็นไปได้ซึ่งขึ้นอยู่กับว่าแอปพลิเคชันเฉพาะของคุณตอบสนองต่อการเปลี่ยนแปลง DLL ฉันคิดว่าเขาสมควรได้รับการโหวต


มีวิธีการย้ายไฟล์ไปยังตำแหน่งชั่วคราวเพื่อให้สามารถลบได้ในภายหลังในขณะที่วางใหม่ในตำแหน่งเดิม (ดังนั้นเซิร์ฟเวอร์ที่เริ่มหลังจากนั้นจะใช้ dll ใหม่) หรือตัวจัดการไฟล์เชื่อมโยงกับตำแหน่งไฟล์หรือไม่?

ทั้งหมดนั้นขึ้นอยู่กับวิธีเขียนแอปพลิเคชัน / วิธีใช้ DLLs ดูคำตอบของ Greg Askew หากหมายเลขอ้างอิงของไฟล์เปิดอยู่คุณไม่สามารถทำอะไรได้เลย คุณสามารถบังคับให้ปิดตัวจัดการไฟล์ได้ แต่คุณจะแทบจะพังอย่างน้อยก็แอพของคุณถ้าไม่ใช่ทั้งระบบปฏิบัติการ
Ryan Ries

ดังนั้น "เหตุผลที่ดี" นี้คืออะไร? จนถึงตอนนี้คำตอบของคุณยังไม่มีเหตุผลที่น่าสนใจว่าทำไม Microsoft ไม่เสนอความสามารถในการแลกเปลี่ยนความร้อน
Konrad Rudolph

2

ไม่คุณไม่ควรคนจรจัดด้วยการจัดการไฟล์ที่มีอยู่

หากคุณสามารถควบคุมการโหลดของแอสเซมบลีและระบุว่าจะเปิดขึ้นพร้อมกับ FileShare.Delete ก็ควรจะสามารถเปลี่ยนชื่อได้ กระบวนการที่มีอยู่จะยังคงอ้างอิงแอสเซมบลีที่ถูกเปลี่ยนชื่อต่อไป

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


2
จากประสบการณ์ของฉันในกรณีส่วนใหญ่ (ดีกว่าครึ่งเวลาในอัตราใดก็ได้) คุณสามารถเปลี่ยนชื่อ (แต่ไม่ลบ) DLL โดยไม่ต้องทำการแก้ไขใด ๆ กับแอปพลิเคชัน
Harry Johnston

@HarryJohnston: ใช่ดูเหมือนว่าฉันสามารถเปลี่ยนชื่อ. dll แม้ว่าจะใช้งานอยู่ ฉันเดาว่าฉันจะทำอย่างนั้นต่อจากนี้ไป

1

ไม่น่าเสียดายที่เป็นไปไม่ได้

ขออภัยเป็นที่แน่นอนเว้นแต่จะมีการผูกปลายหมายความว่าแอปใช้ dll นั้นเมื่อรันบางส่วนของรหัสใน dll นั้น แต่ก็ยังไม่น่าเชื่อถือ


1

คุณสามารถดูว่ากระบวนการโฮสต์ asp.net ทำงานและพัฒนาสิ่งที่คล้ายกันได้อย่างไร

ใช้เว็บแอปพลิเคชันทั้งหมดและย้ายไปยังตำแหน่งชั่วคราวซึ่งแอปพลิเคชันถูกโหลดจริง จากนั้นจะออกจากกระบวนการเพื่อตรวจสอบการเปลี่ยนแปลงในโฟลเดอร์ต้นฉบับเมื่อตรวจพบมันจะหมุนอินสแตนซ์ใหม่ของแอปพลิเคชันในตำแหน่งชั่วคราวใหม่และเริ่มเปลี่ยนเส้นทางคำขอใหม่ไปยังแอปนั้น แอปเก่าจะถูกดึงลงเมื่อคำขอที่ค้างอยู่เสร็จสิ้น

(Nitpicking ใช่มันเป็นมุมมองที่ง่ายขึ้นในกรณีส่วนใหญ่ IIS จะรอคำขอจนกว่าแอปใหม่จะสามารถเข้าครอบครองได้)



0

NSIS Installer มีตัวเลือกหนึ่งตัวเลือกเช่นย้ายไปที่อุณหภูมิในการรีสตาร์ทเครื่อง OS จะตั้งค่าสถานะไฟล์บางไฟล์เพื่อย้ายไปยังตำแหน่งอื่นในการบู๊ตครั้งถัดไปในการบู๊ตเครื่องครั้งต่อไป การค้นหาเพียงเล็กน้อยเกี่ยวกับสิ่งนี้จะทำให้คุณมีความสุขในเรื่องนี้


คุณสามารถให้คำตอบที่สมบูรณ์ในการตอบแทนที่จะบอก OP เพื่อค้นหาวิธีแก้ไข เขาจะไม่อยู่ที่นี่เพื่อถามว่าเขาได้พบวิธีแก้ปัญหาแล้ว ขอบคุณ
John aka hot2use
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.