특정 .dll 파일을 사용하여 실행하는 여러 게임 서버가 있습니다. 때로는 게임 서버를 업데이트해야하지만 이미 실행중인 게임을 중단하고 싶지 않습니다.
.dll 파일을 교체하는 방법이 있습니까 (Windows에 의해 잠겨 있음) 해당 파일을 사용하는 게임 서버의 다음 인스턴스가 새 버전을 열고 이전 버전의 .dll을 다시 시작할 때까지 계속 사용하십시오. ?
그렇게하는 도구 중 하나를 사용하여 파일을 잠금 해제하고 교체하는 것이 안전합니까?
특정 .dll 파일을 사용하여 실행하는 여러 게임 서버가 있습니다. 때로는 게임 서버를 업데이트해야하지만 이미 실행중인 게임을 중단하고 싶지 않습니다.
.dll 파일을 교체하는 방법이 있습니까 (Windows에 의해 잠겨 있음) 해당 파일을 사용하는 게임 서버의 다음 인스턴스가 새 버전을 열고 이전 버전의 .dll을 다시 시작할 때까지 계속 사용하십시오. ?
그렇게하는 도구 중 하나를 사용하여 파일을 잠금 해제하고 교체하는 것이 안전합니까?
답변:
실제로, 당신은 할 수 있고 보통 아무런 문제없이 작동합니다 (항상 그런 것은 아니지만)
당신이하는 일은 파일을 옮기지 않고 이름을 바꾸고 새 파일을 옮기는 것입니다. 이렇게하면 파일에 대한 핸들이 유효하고 작동하여 기존 인스턴스가 여전히 파일에 올바르게 액세스 할 수 있고 새 인스턴스 (또는 새 핸들)가 새 파일로 이동합니다.
프로그램이 동일한 dll 파일을 다시 열고 정확히 같은 상태를 유지할 것으로 예상하는 경우 (예 : dll에서로드 할 리소스가 있고 dll이로드 될 때 실행중인 코드에서 이러한 리소스에 대한 참조가 추출 된 경우) ), 이것은 문제를 일으킬 것이지만 이것은 반드시 표준이 아닙니다.
아니요 . 응용 프로그램이 실행되는 동안 DLL 이 실제 메모리에 완전히 매핑 될 수 있지만 확실히 보장 할 수는 없습니다. DLL (및 실행 파일)의 일부는 RAM에 매핑 될 수 있지만 다른 비트는 디스크에 남아 있으며 나중에 읽을 수 있습니다.
RAM에 매핑 된 비트가 Windows에있는 동안 디스크의 파일을 변경하면 제대로 종료되지 않습니다. Windows는 적절한 이유로이를 잠급니다.
편집 : 일부 사람들은 OS 설계 문제가 아니라 실제로 응용 프로그램 설계 문제 가 무엇인지 Windows를 비난하려는 것처럼 보이기 때문에 무언가를 분명히해야합니다 .
프로세스를 종료하지 않고 응용 프로그램이 Windows에서 사용하는 DLL을 업데이트 할 수 있지만 응용 프로그램은 어셈블리를 언로드하고 업데이트가 완료 될 때까지 기다렸다가 DLL을 다시로드하라는 신호를받을 수 있도록 작성해야합니다. 이것은 실행중인 OS와 관련이 없습니다. 응용 프로그램 디자인 문제입니다.
편집 : 특정 응용 프로그램이 DLL 변경에 응답하는 방식에 따라 작동 할 수 있는 가능한 솔루션에 대한 Stephane의 답변을 참조하십시오 . 나는 그가 공감할 가치가 있다고 생각합니다.
아니요, 기존 파일 핸들을 수정해서는 안됩니다.
어셈블리로드를 제어하고 FileShare.Delete로 열도록 지정하면 이름을 바꿀 수 있습니다. 기존 프로세스는 이름이 바뀐 어셈블리를 계속 참조합니다.
/programming/7147577/programmatically-rename-open-file-on-windows .
asp.net 호스팅 프로세스가 어떻게 작동하는지 살펴보고 비슷한 것을 개발할 수 있습니다.
전체 웹 애플리케이션을 가져 와서 애플리케이션이 실제로로드되는 임시 위치로 이동합니다. 그런 다음 원래 폴더의 변경 사항을 모니터링하는 프로세스를 남겨두고 감지되면 새로운 임시 위치에 응용 프로그램의 새 인스턴스를 스핀 업하고 새 요청을 해당 응용 프로그램으로 리디렉션하기 시작합니다. 보류중인 요청이 완료되면 이전 앱이 종료됩니다.
(Nitpicking, 예, 단순화 된 것입니다. 대부분의 경우 IIS는 새 앱이 인수 할 때까지 요청을 대기시킵니다)
약 10 년 전에 필자는 IIS ISAPI dll 스와핑 을 수행 한 http://www.eggcentric.com/ISAPILoader.htm의 사용자였습니다 . Egg 씨는 여전히 그의 FOSS 솔루션을 지원하고 있습니다.
NSIS 설치 프로그램에는 시스템 재시작시 임시로 이동, OS 부팅시 일부 파일이 다음 부팅시 다른 위치로 이동하도록 옵션이 있습니다. 다음 시스템 부팅시 이러한 플래그가 지정된 파일은 이전에 선택한 새 위치로 자동 이동합니다. 이것에 대한 약간의 검색은 이와 관련하여 당신을 행복하게 할 것입니다.
%LocalAppData%\Google\Chrome\Application폴더와 같은 폴더를 볼 수26.0.1410.64있습니다)