2013-03-28 2 views
11

최근에 .NET 위치에 대한 인터뷰를했습니다. 질문에서 나는 한 가지 질문에 답하는 데 정말로 어려움을 겪고있었습니다. 나는 누군가가 이것에 관해 나를 도울 수 있기를 바란다.응용 프로그램을 다시 시작하지 않고 업데이트 적용

시나리오 (질문) : 응용 프로그램 (winform/wpf UI 응용 프로그램 일 수 있음)의 첫 번째 릴리스가 이미 클라이언트에 전달되어 응용 프로그램을 사용하기 시작했습니다. 그러나 불행히도 현재 QA 팀은 현재 릴리스에서 심각한 문제를 발견했습니다. 이제 문제는 응용 프로그램을 다시 시작하지 않고 패치 (수정)를 보내고 적용 할 수 있어야한다는 것입니다. 응용 프로그램은 패치를 적용하기 위해 다시 시작할 수없는 실시간 응용 프로그램이라고 가정합니다.

필자는 개인적으로 패치를 적용하는 동안 실행중인 응용 프로그램에 영향을주지 않는 설득력있는 대답을하는 데 어려움을 겪고있었습니다.

답 :

감사합니다. 나는이 문제에 대한 해결책을 얻을 수 있었다. 면접관이 질문 한 것인지 확실하지 않습니다. 그럼에도 불구하고 나는 거의 내가 원하는 것을 수행하는 마이크로 소프트의 ClickOnce에 대해 읽었을 때 기뻤다.

+0

수정 프로그램의 어떤 부분이 적용됩니까? UI 만? MEF 같은 것을 사용하여 업데이트 된 코드를 언로드하고 다시로드 할 수 있다고 생각합니다. – eandersson

+0

이 질문은 닫기를 강제하지 않고 업데이트가 수행되도록 (즉, 파일을 덮어 씀) 해석 될 수 있지만 응용 프로그램은 선택적으로 닫은 후 다시 열 때까지 변경 내용을 반영 할 필요가 없으므로 대부분의 경우 적용보다 훨씬 쉽습니다. 실행중인 프로그램을 다시 실행하지 않고 바로 볼 수있는 실행중인 프로그램의 경로. –

+0

@eandersson : 위치가 명확하지 않았습니다. 그럼에도 불구하고 이미 프로세스 가상 공간에있는 DLL에서 UI 픽스 나 수정을하면 어떻게 접근 할 것인가? – sophieJ

답변

-1

이전 파일의 이름을 다른 것으로 바꾸거나 (예 : 파일 이름에 "Old"를 추가) 동일한 파일 이름. 다음에 실행되면 새 실행 파일이 실행됩니다.

+0

사용중인 이름의 이름을 바꿀 수 없습니다. 이것은로드하는 동안 한 번만 읽혀지는 데이터 파일에 대해서만 작동합니다. – JeremyK

+0

@JeremyK 그것은 데이터 파일을 지적하면서 _how_에 따라 다릅니다. 실행 파일은 현재 실행중인 경우에도 잘 덮어 쓸 수 있습니다. –

+0

이것은 일부 파일의 이름을 변경하지 않습니다. 오히려 이미 프로세스/가상 공간에로드 된 dll에서 수정을 구현합니다. 거래자가이 애플리케이션을 사용하여 지연이 발생하지 않는 시장 피드를 포착하는 시나리오를 생각해보십시오. 이것은 응용 프로그램 사용에 대한 임의의 예입니다. – sophieJ

0

먼저이 응용 프로그램이 xml, ini 또는 텍스트 기반 파일 형식과 같은 구성 파일에 의존하는지 알아야합니다. 그렇다면 현재 프로세스의 범위를 벗어나 편집 가능한 한 패치를 구성으로 삽입 할 수 있습니까?

실행 가능한 응용 프로그램이 신뢰할 수있는 DLL인지 여부와 참조 DLL을 통해 종속성으로 패치를 주입하는지 여부를 확인하는 두 번째 솔루션은 다시 시작될 때까지 일시적으로 문제를 해결합니다.

+0

런타임에 어떻게 패치를 주입합니까? 그리고 설정 파일에 패치를 어떻게 삽입합니까? –

+0

실행중인 응용 프로그램이 가능한 공용 API를 가지고 있고 매개 변수를 외부에서 가져와 해당 동작을 변경하는 경우 매개 변수를 구문 분석하여 예상되는 동작을 변경할 수있는 유일한 방법은 이미 시작된 이진 파일을 변경할 수 없습니다. 실행중인 응용 프로그램에서 비동기 스크립트를 사용하여 비헤이비어를 변경하는 것과 같습니다. – Jegan

+0

반드시 그렇지는 않습니다. 응용 프로그램 자체는 변경할 수 없지만 응용 프로그램이 실행중인 기능은 변경할 수 있습니다. 텍스트 기반 구성 만이 유일한 방법은 아닙니다. –

2

현재 실행중인 실행 파일의 경우 거의 멈추었습니다. 메모리에서 실행중인 프로세스를 현저하게 수정할 수는 없습니다.

그러나 DLL에서로드 된 항목은 훨씬 더 유연합니다. 어셈블리는 런타임에 동적으로로드 될 수 있으며 단일 응용 프로그램 내에서 여러 AppDomain을 스핀 업할 수 있습니다.

  • 실행 파일이
  • 당신의 DLL 기능이로드 패치 인 경우 별도의 응용 프로그램 도메인
  • 을 통해 실행되는 DLL에 이르기까지 모든 기능을 전달하는 얇은 래퍼입니다 : 하나 개의 솔루션은 이러한 라인을 따라 뭔가 수 있습니다 필요한 경우 새 DLL이 자동으로 또는 사용자 상호 작용에 대한 응답으로
  • 으로 복사되고 새 AppDomain이 기존 패치와 함께 시작되어 새 패치
  • 이 실행됩니다. 앱의 적절한 지점 (예 : 전체 화면 sw 가려움 또는 시간 제한 새로 고침), 새로운 응용 프로그램 도메인은 "라이브"하나
  • 기존의 응용 프로그램 도메인이 종료

그러나, 이것은 매우 높은 수준이다 폐기된다. 현실적인 상황에서는 캐싱 및 라이브 데이터 및 기타 여러 가지 고려 사항이 포함 된 다중 계층 응용 프로그램을 사용할 가능성이 큽니다. 예를 들어 응용 프로그램의 프론트 엔드 논리를 캐싱 또는 데이터 처리 부분과 분리하여 나머지 부분을 방해하지 않고 어느 한 부분을 전환 할 수 있어야합니다.

정확한 요구 사항에 따라 일부 드문 기술이 유용 할 수 있습니다. 고급 캐싱을 사용하면 프런트 엔드에서 데이터를 표시하지 않고 데이터 계층을 스왑 아웃 할 수 있습니다. 명령 대기열 또는 신뢰할 수있는 메시징 메커니즘을 사용하면 비즈니스 계층을 스왑 아웃하는 동안 UI가 응답을 유지하고 새 비즈니스 계층에서 큐를 처리 할 수 ​​있습니다. (논리적으로) 서버 기반 응용 프로그램을 사용하는 경우 각 계층의 중복성으로 인해 계층의 하나의 중복 "서버"가 업데이트되는 동안 다른 서버가 처리를 계속할 수 있습니다.

1

이 요구 사항이있는 경우 처음부터 앱을 두 개의 다른 애플리케이션 (UI 조각과 개별 원자 함수 호출에서 모든 작업을 수행하는 서비스)으로 분리 할 수 ​​있습니다. 버그가 서비스 중일 가능성이 높으므로 사용자 환경을 방해하지 않고 언제든지 해당 응용 프로그램을 교체 할 수 있습니다.

관련 문제