2009-06-17 3 views
9

개발 한 플랫폼에 대해 외부 업데이터 응용 프로그램을 시작하려고합니다. 이 업데이트 프로그램을 시작하려는 이유는 플랫폼의 업데이트 및 라이센스 구성을 처리하는 구성 유틸리티가 업데이트가 배포 될 폴더의 다른 어셈블리와 종속성을 공유했기 때문입니다. 따라서 업데이트를 배포 할 때 구성 유틸리티의 이름을 바꾸고 덮어 쓸 수는 있지만 의존하는 DLL의 이름을 바꾸거나 덮어 쓸 수는 없습니다. 따라서 외부 업데이터 응용 프로그램.부모 프로세스보다 오래 걸리는 프로세스를 만드는 방법

구성 유틸리티에서 모든 업데이트 수집 논리를 처리 한 다음 업데이터를 시작하여 실제 파일 복사/덮어 쓰기 작업을 처리하려고합니다. 분명히 사용중인 파일 때문에 업데이트 유틸리티가 시작된 직후에 구성 유틸리티를 종료해야합니다.

내가 가지고있는 문제는 내가 업데이터를 시작하는 표준 Process.Start 메서드를 사용하고 있으며 구성 유틸리티가 종료되자 마자 업데이터 프로세스도 종료된다는 것입니다.

부모 프로세스를 초과하는 프로세스를 만들거나 프로세스를 시작할 수있는 외부 응용 프로그램을 시작할 수있는 방법이 있습니까?

는 편집 :

분명히, 내 업데이터 응용 프로그램에서, 나는에 전달되는 명령 행 인수의 수를 잘못 계산. 이 때문에 업데이트 프로그램이 즉시 종료됩니다. 나는 이것을 발언자 응용 프로그램이 실제로 "자식"프로세스를 죽이고 있다고 잘못 해석했습니다.

아래 답변이 정확합니다.

+0

필자는 일종의 역으로 ​​생각하고 있지만, 전체 작업이 구성 유틸리티와 응용 프로그램 모두를 관리하는 프로세스인지 확인할 수 있습니까? 그렇게하면 응용 프로그램과 구성 유틸리티 (필요할 경우)를 모두 업데이트 할 수 있으며 부모 프로세스가 부모 프로세스와 항상 함께 실행되므로 걱정할 필요가 없습니다. –

+0

업데이터 코드에서 바로 종료하도록 한 버그가 있습니다. 나는 이것을 "시작하는"과정에서 나온 것이라고 생각했다. 그에 따라 메시지를 업데이트했습니다. 어리석은 실수를 저지르기위한 자기 처벌로서 부정적인 담당자를 내줄 수있는 방법이 있습니까? –

+0

C#/Mono/* nix가 아니라 C#/.net/Win32를 사용한다고 가정 할 수 있습니까? Process가 모든 환경에서 동일하게 작동하는지 여부는 알 수 없습니다. – quillbreaker

답변

11

일부 코드를 공유해주세요. Process 클래스는 응용 프로그램이 종료 될 때 Process.Start을 사용하여 시작된 모든 프로세스를 종료시키지 않으므로 다른 이유로보고있는 것 같습니다. 내 안개가 메모리에서

using System.Diagnostics; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Process.Start(@"C:\windows\system32\calc.exe"); 
    } 
} 
+0

당신은 절대적으로 옳습니다, 제 가정은 속도에 의해 흐려졌습니다. 그에 따라 내 질문을 업데이트했습니다. –

5

런처가 종료 될 때 Process.Start으로 시작되는 프로세스가 자동으로 종료되는 이유는 없습니다. 내 생각 엔 당신이 업데 이터에서 이상한 일을하고 있다는 것입니다.

전 정확히 이런 종류의 일을하는 업데이터를 작성 했으므로 괜찮습니다. 예를 들어

:

Launcher.cs :

using System; 
using System.Diagnostics; 

class Launcher 
{ 
    static void Main() 
    { 
     Console.WriteLine("Launching launchee"); 
     Process.Start("Launchee.exe"); 
     Console.WriteLine("Launched. Exiting"); 
    } 
} 

Launchee.cs :

using System; 
using System.Threading; 

class Launchee 
{ 
    static void Main() 
    { 
     Console.WriteLine("  I've been launched!"); 
     Thread.Sleep(5000); 
     Console.WriteLine("  Exiting..."); 
    } 
} 

별도로, 둘 다 컴파일하고 LAUNCHER.EXE를 실행합니다. "발사"프로세스는 발사기보다 확실히 오래 지속됩니다.

+0

업데이터를 시작하는 구성 유틸리티는 Windows Forms 응용 프로그램입니다. 내가보고있는 것과 관련이있을 수 있습니까? –

+0

비슷한 일을하고 있습니다. 콘솔 앱이 소켓을 통해 열린 연결을 가지고있는 Java 프로세스를 시작합니다. 콘솔 앱의 기본 메소드가 값 (int 반환 유형)을 반환 한 후에도 콘솔이 닫히지 않습니다. . 자바 프로세스가 실행될 때까지 추측한다. 어떤 아이디어? –

+0

@KyloRen : [mcve]가 없으면별로 없습니다. 우리가 재현 할 수있는 방식으로 새로운 질문을 게시하는 것이 좋습니다. –

0

그냥 생각,하지만 난 Process.Start를 방법이 때 잠시 다시 토론을 기억한다는 것 :

하는이 간단한 샘플 프로그램을 참조하십시오, 계산기가 열려있을 것입니다 폼에서 호출 된 프로세스는 일종의 의존성을 가지고 있습니다. (무엇을, 왜, 어떻게, 메모리가 안개인지 확실하지 않습니다.)

처리하기 위해 기본 폼/app이 종료 된 후 실제로 Main() 메서드에서 호출 된 플래그가 설정되었으며 Main() 메서드에서 프로세스가 시작된 경우 eveything이 작동했습니다. 잘 됐네.

내가 말했듯이 이것은 순수하게 메모리에서 나온 것이지만 여기에 게시 된 일부 예제는 콘솔 응용 프로그램의 Main() 메서드에서 호출되어 일부를 조그만하게 보였다.

희망 사항은 모두 잘 해결됩니다.

+1

나는 그런 행동을 재현 할 수 없었고, 이것이 사실이라면 나는 정말로 놀랄 것이다. 자식 프로세스는 부모 프로세스 내부에서 특별한 동작을 구현하지 않는 한 모든 자식을 죽이지 않는 한, 일반적으로 부모 프로세스가 죽으면 통지하지 않습니다 (그리고 이것은 OS 레벨 것입니다). –

+0

나는 똑같은 가정을 가지고 있었고, 분명히 우리의 기억은 어떤 종류의 심령 IPC 또는 뭔가를 사용하고있다. :) –

관련 문제