Thay thế các tập tin trong khi ứng dụng đang chạy?


18

Tôi có một số máy chủ trò chơi sử dụng một tập tin nhất định để chạy. Đôi khi tôi cần cập nhật các máy chủ trò chơi nhưng tôi không muốn làm gián đoạn các trò chơi đang chạy.

Có cách nào để thay thế tệp dll (bị Windows khóa) không, vì vậy các phiên bản tiếp theo của máy chủ trò chơi sử dụng tệp đó sẽ mở phiên bản mới và các phiên bản cũ tiếp tục sử dụng phiên bản cũ của tệp đó cho đến khi chúng được khởi động lại ?

Có an toàn không khi chỉ mở khóa tệp bằng một trong những công cụ đó và thay thế nó?


Có lẽ không phải trò chơi của bạn. Tuy nhiên, Chrome không cập nhật mà không làm gián đoạn quá trình của bạn. Thật không may, đây là ứng dụng cụ thể. (Đi đến %LocalAppData%\Google\Chrome\Applicationvà bạn sẽ thấy các thư mục 26.0.1410.64lưu trữ DLL của các phiên bản khác nhau)
Alvin Wong

Tùy thuộc vào phần mềm được đề cập, có thể cài đặt và chạy hai hoặc nhiều phiên bản khác nhau (ở các vị trí khác nhau). Không hiệu quả, nhưng có lẽ khả thi.
Harry Johnston

Câu trả lời:


23

Trên thực tế, bạn có thể và nó thường hoạt động mà không có vấn đề gì (mặc dù không phải lúc nào cũng vậy)

Những gì bạn làm là đổi tên tệp mà không di chuyển tệp và di chuyển tệp mới qua nó. Điều đó sẽ giữ cho các thẻ điều khiển cho tệp hợp lệ và hoạt động để các phiên bản tồn tại trước vẫn có thể truy cập tệp đúng cách và các phiên bản mới (hoặc các thẻ điều khiển mới) sẽ chuyển đến tệp mới.

Rõ ràng, nếu một chương trình mở lại cùng một tệp dll và hy vọng nó sẽ giữ nguyên chính xác (ví dụ: nếu có tài nguyên được tải từ dll và các tham chiếu đến các tài nguyên này được trích xuất từ ​​mã đang chạy khi tải dll ), điều này sẽ gây ra vấn đề nhưng điều này chắc chắn không phải là tiêu chuẩn.


11

Không. Mặc dù một DLL có thể được ánh xạ hoàn toàn vào bộ nhớ vật lý trong khi ứng dụng chạy, nhưng chắc chắn không có gì đảm bảo điều đó. Các phần của DLL (và thậm chí cả tệp thực thi) có thể được ánh xạ vào RAM trong khi các bit khác của nó nằm trên đĩa và có thể được đọc sau đó.

Thay đổi tệp trên đĩa trong khi Windows có các bit được ánh xạ trong RAM sẽ không kết thúc tốt. Windows khóa nó vì một lý do tốt.

Chỉnh sửa: Tôi cần làm rõ điều gì đó vì một số người dường như có ý định đổ lỗi cho Windows về vấn đề thiết kế ứng dụng thực sự chứ không phải vấn đề thiết kế hệ điều hành.

Bạn có thể cập nhật DLL mà các ứng dụng sử dụng trong Windows mà không kết thúc quá trình, nhưng ứng dụng phải được viết theo cách có thể được báo hiệu để giải nén lắp ráp, đợi cập nhật kết thúc, sau đó tải lại DLL. Điều này không có gì để làm với hệ điều hành bạn đang chạy. Đây là một vấn đề thiết kế ứng dụng.

Chỉnh sửa: Cũng xem câu trả lời của Stephane cho một giải pháp khả thi có thể hoạt động, tùy thuộc vào cách ứng dụng cụ thể của bạn phản ứng với sự thay đổi DLL của nó. Tôi nghĩ rằng anh ấy xứng đáng nhận được một upvote.


Có cách nào để di chuyển tệp đó đến một vị trí tạm thời để có thể xóa nó sau đó, trong khi đặt một tệp mới vào vị trí cũ của nó (vì vậy các máy chủ bắt đầu sau đó sẽ sử dụng dll mới)? Hoặc là xử lý tập tin được liên kết với vị trí tập tin?

Điều đó hoàn toàn phụ thuộc vào cách ứng dụng được viết / cách nó sử dụng DLL. Hãy xem câu trả lời của Greg Askew. Nếu xử lý tệp đang mở, bạn không thể làm gì nhiều với nó. Bạn có thể buộc phải xử lý tập tin nhưng gần như chắc chắn bạn sẽ gặp sự cố ít nhất là ứng dụng của bạn, nếu không phải là toàn bộ HĐH.
Ryan Ries

Vì vậy, lý do tốt này là gì? Cho đến nay câu trả lời của bạn không chứa một lý do thuyết phục tại sao Microsoft không cung cấp khả năng trao đổi nóng.
Konrad Rudolph

2

Không, bạn không nên tinker với các xử lý tập tin hiện có.

Nếu bạn có thể kiểm soát việc tải lắp ráp và chỉ định nó được mở bằng FileShare.Delete, thì có thể đổi tên nó. Các quy trình hiện tại sẽ tiếp tục tham chiếu lắp ráp được đổi tên.

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


2
Theo kinh nghiệm của tôi, trong hầu hết các trường hợp (tốt, hơn một nửa thời gian, với bất kỳ giá nào), bạn có thể đổi tên (nhưng không xóa) một DLL mà không cần sửa đổi ứng dụng.
Harry Johnston

@HarryJohnston: Vâng, có vẻ như tôi có thể đổi tên dll ngay cả khi nó được sử dụng. Tôi đoán tôi sẽ làm điều đó từ bây giờ.

1

Không, thật không may là nó không thể.

Xin lỗi, chính xác là trừ khi có ràng buộc muộn, nghĩa là ứng dụng sử dụng dll đó khi chạy một phần mã trong dll đó, nhưng nó vẫn không đáng tin cậy.


1

Bạn có thể xem cách quy trình lưu trữ asp.net hoạt động và phát triển một cái gì đó tương tự.

Nó lấy toàn bộ ứng dụng web và di chuyển nó đến một vị trí tạm thời mà ứng dụng được tải thực sự. Sau đó, nó để lại một quá trình theo dõi các thay đổi trong thư mục gốc, khi được phát hiện, nó sẽ tạo ra một phiên bản mới của ứng dụng ở một vị trí tạm thời mới và bắt đầu chuyển hướng các yêu cầu mới đến ứng dụng đó. Ứng dụng cũ sau đó bị phá bỏ sau khi yêu cầu chờ xử lý kết thúc.

(Nitpicking, vâng, đó là một cái nhìn đơn giản hóa mọi thứ, trong hầu hết các trường hợp IIS xếp hàng các yêu cầu cho đến khi ứng dụng mới có thể tiếp quản)



0

NSIS Installer có một tùy chọn là Move To Temp trên Machine Restart, OS gắn cờ một số tệp để di chuyển đến vị trí khác trong lần khởi động tiếp theo, trên máy tiếp theo khởi động các tệp được gắn cờ này sẽ tự động di chuyển đến vị trí mới bạn đã chọn trước đó. Một tìm kiếm nhỏ về điều này sẽ làm cho bạn hạnh phúc về vấn đề này.


Bạn có thể cung cấp câu trả lời đầy đủ trong câu trả lời của mình thay vì yêu cầu OP tìm kiếm giải pháp. Anh ta sẽ không ở đây để hỏi xem anh ta đã tìm ra giải pháp chưa. Cảm ơn.
John aka hot2use
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.