응용 프로그램이 실행되는 동안 .dll 파일을 교체 하시겠습니까?


18

특정 .dll 파일을 사용하여 실행하는 여러 게임 서버가 있습니다. 때로는 게임 서버를 업데이트해야하지만 이미 실행중인 게임을 중단하고 싶지 않습니다.

.dll 파일을 교체하는 방법이 있습니까 (Windows에 의해 잠겨 있음) 해당 파일을 사용하는 게임 서버의 다음 인스턴스가 새 버전을 열고 이전 버전의 .dll을 다시 시작할 때까지 계속 사용하십시오. ?

그렇게하는 도구 중 하나를 사용하여 파일을 잠금 해제하고 교체하는 것이 안전합니까?


아마 당신의 게임이 아닙니다. 그러나 Chrome 프로세스를 중단 하지 않고 업데이트합니다. 불행히도 이것은 응용 프로그램에 따라 다릅니다. (가서 다른 버전의 DLL을 저장하는 %LocalAppData%\Google\Chrome\Application폴더와 같은 폴더를 볼 수 26.0.1410.64있습니다)
Alvin Wong

해당 소프트웨어에 따라 두 개 이상의 개별 인스턴스 (다른 위치에)를 설치하고 실행할 수 있습니다. 비효율적이지만 아마도 실행 가능합니다.
Harry Johnston

답변:


23

실제로, 당신은 할 수 있고 보통 아무런 문제없이 작동합니다 (항상 그런 것은 아니지만)

당신이하는 일은 파일을 옮기지 않고 이름을 바꾸고 새 파일을 옮기는 것입니다. 이렇게하면 파일에 대한 핸들이 유효하고 작동하여 기존 인스턴스가 여전히 파일에 올바르게 액세스 할 수 있고 새 인스턴스 (또는 새 핸들)가 새 파일로 이동합니다.

프로그램이 동일한 dll 파일을 다시 열고 정확히 같은 상태를 유지할 것으로 예상하는 경우 (예 : dll에서로드 할 리소스가 있고 dll이로드 될 때 실행중인 코드에서 이러한 리소스에 대한 참조가 추출 된 경우) ), 이것은 문제를 일으킬 것이지만 이것은 반드시 표준이 아닙니다.


11

아니요 . 응용 프로그램이 실행되는 동안 DLL 실제 메모리에 완전히 매핑 수 있지만 확실히 보장 할 수는 없습니다. DLL (및 실행 파일)의 일부는 RAM에 매핑 될 수 있지만 다른 비트는 디스크에 남아 있으며 나중에 읽을 수 있습니다.

RAM에 매핑 된 비트가 Windows에있는 동안 디스크의 파일을 변경하면 제대로 종료되지 않습니다. Windows는 적절한 이유로이를 잠급니다.

편집 : 일부 사람들은 OS 설계 문제가 아니라 실제로 응용 프로그램 설계 문제 가 무엇인지 Windows를 비난하려는 것처럼 보이기 때문에 무언가를 분명히해야합니다 .

프로세스를 종료하지 않고 응용 프로그램이 Windows에서 사용하는 DLL을 업데이트 할 수 있지만 응용 프로그램은 어셈블리를 언로드하고 업데이트가 완료 될 때까지 기다렸다가 DLL을 다시로드하라는 신호를받을 수 있도록 작성해야합니다. 이것은 실행중인 OS와 관련이 없습니다. 응용 프로그램 디자인 문제입니다.

편집 : 특정 응용 프로그램이 DLL 변경에 응답하는 방식에 따라 작동 할 있는 가능한 솔루션에 대한 Stephane의 답변을 참조하십시오 . 나는 그가 공감할 가치가 있다고 생각합니다.


파일을 임시 위치로 이동하여 나중에 삭제할 수 있고 이전 위치에 새 파일을 넣을 수있는 방법이 있습니까? 또는 파일 핸들이 파일 위치에 연결되어 있습니까?

그것은 전적으로 응용 프로그램 작성 방법 / DLL 사용 방법에 달려 있습니다. Greg Askew의 답변을 살펴보십시오. 파일 핸들이 열려 있으면 할 수있는 일이 많지 않습니다. 파일 핸들을 강제로 닫을 수는 있지만 전체 OS가 아닌 경우 적어도 앱이 거의 중단됩니다.
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 설치 프로그램에는 시스템 재시작시 임시로 이동, OS 부팅시 일부 파일이 다음 부팅시 다른 위치로 이동하도록 옵션이 있습니다. 다음 시스템 부팅시 이러한 플래그가 지정된 파일은 이전에 선택한 새 위치로 자동 이동합니다. 이것에 대한 약간의 검색은 이와 관련하여 당신을 행복하게 할 것입니다.


OP에게 솔루션을 검색하도록 지시하는 대신 답장에 완전한 답변을 제공 할 수 있습니다. 그는 이미 해결책을 찾았는지 묻지 않았습니다. 감사.
John aka hot2use
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.