내 C # WinForm 응용 프로그램을 어떻게 다시 시작합니까?


86

C # .NET 2.0 WinForm 응용 프로그램 개발. 응용 프로그램을 닫고 자체적으로 다시 시작해야합니다.

Application.Restart();

위의 방법은 신뢰할 수없는 것으로 입증되었습니다 .

응용 프로그램을 다시 시작하는 더 좋은 방법은 무엇입니까?


3
앱을 다시 시작해야할지 궁금합니다. 당신의 상황은 어떻습니까?
JeffH 2009

우리의 특정 상황-루프에서 일부 이미지와 플래시 콘텐츠를 실행해야하는 미디어 플레이어 응용 프로그램입니다. 컴퓨터를 다시 시작하지 않고 며칠 동안 실행해야하며 키보드 / 마우스가 없으므로 사용자 상호 작용이 없습니다. 프로그램이 충돌하면 (처리되지 않은 예외) 프로그램을 다시 시작해야하며 종료하거나 오류를 표시하지 마십시오. stackoverflow.com/questions/773768/… 프로그램에 내가 방지 할 수없는 예외가 계속 발생하는 이유를 확인하십시오. :(
Adam Nofsinger

1
결국, 우리 애플리케이션을위한 훨씬 더 나은 솔루션은 메인 애플리케이션에서 시작되는 (아직 실행되지 않은 경우) 작은 Watchdog 애플리케이션을 개발하는 것이 었습니다. 워치 독은 메인 애플리케이션에 여전히 실행중인 프로세스가 있는지 확인하기 위해 약 10 초마다 확인하고 그렇지 않은 경우 하나를 시작합니다. 기본 앱에서 다시 시작하는 것보다 간단하고 우아하며 훨씬 견고합니다.
Adam Nofsinger

2
다시 시작하는 또 다른 이유는 언어를 변경하거나 업데이트를 다운로드 한 경우입니다.
앤드류 작은 바퀴

1
하지만 만약 ... 워치 독 애플리케이션이 충돌한다면?
Metoniem

답변:


39

불행히도 Process.Start ()를 사용하여 현재 실행중인 프로세스의 인스턴스를 시작할 수 없습니다. Process.Start () 문서에 따르면 "프로세스가 이미 실행 중이면 추가 프로세스 리소스가 시작되지 않습니다 ..."

이 기술은 VS 디버거에서 잘 작동하지만 (VS는 Process.Start가 프로세스가 아직 실행 중이 아니라고 생각하게하는 일종의 마법을 수행하기 때문에) 디버거에서 실행되지 않으면 실패합니다. (이것은 OS에 따라 다를 수 있습니다. 일부 테스트에서는 XP 또는 Vista에서 작동했지만 디버거에서 실행 한 것을 기억하고있을 수 있습니다.)

이 기술은 제가 현재 작업하고있는 프로젝트의 마지막 프로그래머가 사용한 것과 정확히 일치하며 꽤 오랫동안 이에 대한 해결 방법을 찾으려고 노력해 왔습니다. 지금까지 한 가지 해결책 만 찾았는데, 그저 더럽고 칙칙한 느낌이 듭니다. 첫 번째 애플리케이션이 종료 될 때까지 백그라운드에서 대기하는 두 번째 애플리케이션을 시작한 다음 첫 번째 애플리케이션을 다시 시작합니다. 나는 그것이 작동 할 것이라고 확신하지만, 쉿.

편집 : 두 번째 응용 프로그램을 사용하면 작동합니다. 두 번째 앱에서 제가 한 것은 다음과 같습니다.

    static void RestartApp(int pid, string applicationName )
    {
        // Wait for the process to terminate
        Process process = null;
        try
        {
            process = Process.GetProcessById(pid);
            process.WaitForExit(1000);
        }
        catch (ArgumentException ex)
        {
            // ArgumentException to indicate that the 
            // process doesn't exist?   LAME!!
        }
        Process.Start(applicationName, "");
    }

(이것은 매우 간단한 예제입니다. 실제 코드에는 온 전성 검사, 오류 처리 등이 많이 있습니다.)


나는 HiredMind에 동의하며 실제로 답을 작성한 직후 동일한 "Watchdog 프로그램"구현을 사용했습니다. 죄송합니다. 여기로 돌아와서 업데이트해야합니다. 나는 그것이 너무 끔찍하게 못 생기고 / 엉뚱하고 / 더러워 야한다고 생각하지 않을 것 입니다. Watchdog 프로그램 패턴은 꽤 널리 사용됩니다.
Adam Nofsinger

실제로 디스크에 두 번째 응용 프로그램이 필요하지 않습니다. 스크립트를 사용하여 임시 이름으로 즉석에서 생성 할 수 있습니다. 다시 시작하기 위해 두 번째 응용 프로그램을 사용하는 것에 대한 죄책감이 완화 될 수 있습니다. ... 아니면 "개의 발광은"전체 C # 응용 프로그램은 .. 디스크에 저장, 컴파일하고 (더러운, 더러운 생각을) 실행할 수 있습니다 자신의
Loudenvier

첫 번째 단락은 올바르지 Process.Start않습니다. 실행중인 OS 프로세스 목록을 보지 않습니다. 이 문서 문 은 클래스 의 해당 객체 인스턴스 에 대해서만 설명합니다 Process. Process클래스는 실행중인 프로세스에 첨부 할 수 있지만 또한 시작하지 않은 상태가 될 수 있습니다. 제 생각에는 이것은 디자인이 망가진 것입니다. 모범 사례 인 IMO는 Process 인스턴스를 재사용하지 않고 생성 후 즉시 시작하는 것입니다. 이상적으로는 정적 Process.Start방법을 사용하십시오 . 그러면이 문서 및 디자인 결함이 작동하지 않습니다.
usr

여기에 표시된 코드는 WaitForExit(1000). 그러나 새로운 프로세스를 시작하기 위해 전체 대기가 필요하지는 않습니다. 원하는 추가 동작 일 수 있지만 새 프로세스를 시작할 필요는 없습니다.
usr

지금은 잘 모르겠지만 9 년 전 (에헴) 이것은 확실히 옳았습니다. :-)
HiredMind

71

나를 위해 일한 훨씬 간단한 접근 방식은 다음과 같습니다.

Application.Restart();
Environment.Exit(0);

이렇게하면 명령 줄 인수가 유지되고 일반적으로 응용 프로그램이 닫히지 않도록하는 이벤트 처리기가 있더라도 작동합니다.

Restart () 호출은 종료를 시도하고 어쨌든 새 인스턴스를 시작하고 반환합니다. 그런 다음 Exit () 호출은 이벤트 처리기에 실행할 기회를주지 않고 프로세스를 종료합니다. 두 프로세스가 모두 실행되는 매우 짧은 기간이 있습니다. 제 경우에는 문제가되지 않지만 다른 경우에는 가능합니다.

종료 코드 0 입력은 Environment.Exit(0);완전 종료 를 지정합니다. 1로 종료하여 오류가 발생했음을 지정할 수도 있습니다.


간단하지만 신뢰할 수 있습니다. 이것은 받아 들여진 대답이어야합니다. 모든 전역 변수를 비우고 응용 프로그램이 방금 시작된 것처럼 표시되는 로그 아웃 기능을 구현하려고했습니다. 로그인 패널을 보여주고 DB에서 중요한 정보를 담고있는 모든 전역 변수를 아무것도 초기화하지 않으려 고했습니다. 이것은 삶을 훨씬 더 단순하게 만들었습니다. 감사!
DavidG apr.

System.Windows.Forms.Application.Restart ()는 WPF 응용 프로그램에서도 작동합니다. Windows 10 OS에서 테스트되었습니다.
NthDeveloper

뭐야?! 농담 ... 맞지? C # <3. 이것은 기본적으로 OnClose()양식 이벤트 및 유사 항목을 발생 시키지 않습니다 .
F8ER

56

메인 앱 형태라면 사용 해보세요

System.Diagnostics.Process.Start( Application.ExecutablePath); // to start new instance of application
this.Close(); //to turn off current app

7
비슷하지만 다릅니다. Application.Exit가 작동하지 않았고 this.Close ()가 작업을 수행했습니다.
Darqer

1
May Enviorment.Exit(0)도 그 일을 할 것입니다.
Dwza

2
Enviorment.Exit응용 프로그램 정리 코드가 실행되는 것을 방지하기 때문에 더럽고 침략적인 종료입니다. 대부분의 경우 올바른 선택이 아닙니다.
usr

16

나는 파티에 늦을 수도 있지만 여기에 내 간단한 해결책이 있으며 내가 가진 모든 응용 프로그램에서 매력처럼 작동합니다.

        try
        {
            //run the program again and close this one
            Process.Start(Application.StartupPath + "\\blabla.exe"); 
            //or you can use Application.ExecutablePath

            //close this one
            Process.GetCurrentProcess().Kill();
        }
        catch
        { }

Win-7-x64 및 Win-XP-x32에서 매우 잘 작동합니다. 문서의 제약에 대해서는 아무것도 보지 못합니다 . 이것은 받아 들여진 대답이어야합니다.
Bitterblue

@Bitterblue 게시 한 문서에 대한 링크에는 "프로세스가 이미 실행 중이면 추가 프로세스 리소스가 시작되지 않습니다."라고 표시됩니다. 비고란의 세 번째 줄입니다. 이런식이 아니 었으면 좋겠지 만 그렇습니다.
HiredMind

@HiredMind 우리 각자에게 "제약"이 무엇을 의미하는지 논쟁 할 수있을 것 같습니다. 그러나이 섹션의 제목은 "Constraints"가 아니라 "Remarks"입니다. 그래서 나는 그것과 함께 살 수 있습니다. 그리고 왜 그렇게 되지 않았 으면 좋겠습니까? 그것에 문제가 있었습니까? 내가하지 않았 으니까. 나를 위해 완벽하게 작동합니다.
Bitterblue

@HiredMind 이것은 개인적이거나 아무것도 아니지만 내 C # 앱을 다시 시작하기 위해 두 번째 앱이나 스크립트를 사용한다는 생각은 나에게 반발합니다. Win7은 지금까지 릴리스 모드에서이 메서드를 완벽하게 실행합니다 (사용자가 언어를 변경할 때 앱을 다시 시작하는 데 사용합니다 = 중요하지 않음). 따라서 사용자에게 내가 승인하지 않은 방법을 사용하는 것보다 수동으로 앱을 다시 시작하라고 지시하고 싶습니다. 나는 과거에 스크립트를 사용해 왔지만 완전히 싫었습니다.
Bitterblue

@BitterBlue 두 번째 앱을 사용하는 것이 좋지 않다는 데 동의합니다. 제 대답에서 그렇게 말했습니다. 하지만 디버거 외부에서 단일 앱 방법을 사용해 보셨습니까? 이 답변을 남겼을 때 일부 Windows 버전에서는 작동하지 않았으며 릴리스 또는 디버그 모드는 관련이 없습니다. 그것이 당신을 위해 작동한다면 좋습니다! 하지만 저는이 문제에 물 렸고 수백 명의 화난 사용자를 받았습니다.
HiredMind 2015 년

12

저도 똑같은 문제를 겪었고 중복 인스턴스를 방지해야한다는 요구 사항도있었습니다. HiredMind가 제안한 대안에 대한 대안을 제안합니다 (잘 작동합니다).

내가하고있는 일은 이전 프로세스 (다시 시작을 트리거하는 프로세스)의 processId를 cmd 줄 인수로 사용하여 새 프로세스를 시작하는 것입니다.

// Shut down the current app instance.
Application.Exit();

// Restart the app passing "/restart [processId]" as cmd line args
Process.Start(Application.ExecutablePath, "/restart" + Process.GetCurrentProcess().Id);

그런 다음 새 앱이 시작되면 먼저 cm 행 인수를 구문 분석하고 processId와 함께 다시 시작 플래그가 있는지 확인한 다음 해당 프로세스가 종료 될 때까지 기다립니다.

if (_isRestart)
{
   try
   {
      // get old process and wait UP TO 5 secs then give up!
      Process oldProcess = Process.GetProcessById(_restartProcessId);
      oldProcess.WaitForExit(5000);
   }
   catch (Exception ex)
   { 
      // the process did not exist - probably already closed!
      //TODO: --> LOG
   }
}

나는 내가 가지고있는 모든 안전 점검 등을 분명히 보여주지 않고있다.

이상적이지 않더라도-나는 이것이 유효한 대안이라고 생각하므로 다시 시작을 처리하기 위해 별도의 앱을 배치 할 필요가 없습니다.


1
이것에 대한 깔끔한 해결책이 있다는 IMHO. 또한 단일 인스턴스가 있어야하며 사용자가 애플리케이션을 다시 시작할 수 있도록 허용해야합니다 (예 : 충돌시). 솔루션을 거의 구현했지만 여러 인스턴스를 실행할 있는 다른 명령 줄 인수를 추가하는 것이 더 낫다는 생각이 들었습니다 .
Dennis

음, 당신은 논리를 뒤집고 있습니다-나는 그것을 좋아합니다! 유일한 문제는 누군가가 여러 인스턴스를 허용하는 cmd 라인 인수를 알아 내면 이상한 일이 발생할 수 있다는 것입니다. D
JohnIdol

글쎄요, 사용자들이 요청 해주신 기능이라 다행이라 WIN-WIN이었습니다. 나는 그들이 /allowMultipleInstances이상한 깃발보다 깃발 을 '찾는'것을 선호합니다 /restart.
Dennis

네, 확실히 더 나은 솔루션 인 여러 인스턴스를 허용한다면 :)
JohnIdol

@JohnIdol 좋네요. 내 플래그를 "-waitForProcessToExit"또는 다른 것으로 변경할 것이라고 생각하지만 그렇지 않으면 더 우아한 솔루션입니다. 지금은 다른 EXE에서 하나의 EXE를 참조하는 ClickOnce 문제와 씨름하고 있으며이 문제를 해결할 수 있습니다.
HiredMind

6

시작 / 종료 방법

// Get the parameters/arguments passed to program if any
string arguments = string.Empty;
string[] args = Environment.GetCommandLineArgs();
for (int i = 1; i < args.Length; i++) // args[0] is always exe path/filename
    arguments += args[i] + " ";

// Restart current application, with same arguments/parameters
Application.Exit();
System.Diagnostics.Process.Start(Application.ExecutablePath, arguments);

이것은 Application.Restart ();보다 잘 작동하는 것 같습니다.

프로그램이 다중 인스턴스로부터 보호하는 경우 이것이 어떻게 처리되는지 확실하지 않습니다. 제 생각에는 두 번째 .exe를 실행하는 것이 더 나을 것입니다.


2
애플리케이션이 여러 인스턴스에서 보호되는 경우 작동하지 않을 수 있습니다.
majkinetor

예, Application.Exit () 호출하면 펌핑해야 할 어딘가에 대기열에 일부 메시지가 추가되기 때문에 여기에있는 두 번째 코드는 실제로 작동하지 않을 것입니다.
Adam Nofsinger

불행히도이 기술은 작동하지 않습니다 (그렇게했으면합니다! 내 솔루션보다 훨씬 더 간단합니다). Visual Studio 디버거 내에서 작동하지만 실제로는 작동하지 않습니다. 디버거 외부에서 작동하는 복잡한 솔루션에 대한 내 대답을 참조하십시오.
HiredMind

HiredMind가 옳을 수 있습니다. 나는 Watchdog 패턴 솔루션으로 끝났습니다.
Adam Nofsinger

6

간단합니다 Application.Restart(). 다시 시작하기 위해 응용 프로그램을 호출하는 경향이 있는 메서드를 호출하면됩니다. 그러나 오류 코드를 사용하여 로컬 환경을 종료해야합니다.

Application.Restart();
Environment.exit(int errorcode);

효율적으로 사용할 수 있도록 오류 코드 열거를 만들 수 있습니다.
또 다른 방법은 응용 프로그램을 종료하고 실행 경로가있는 프로세스를 시작하는 것입니다.

Application.exit();
System.Diagnostics.Process.Start(Application.ExecutablePath);

제 경우에는 워치 독 앱이 필요하지 않았습니다.
user685590 2013 년

3

이 코드를 시도하십시오.

bool appNotRestarted = true;

이 코드는 함수에 있어야합니다.

if (appNotRestarted == true) {
    appNotRestarted = false;
    Application.Restart();
    Application.ExitThread();
}

3

나는 또 다른 해결책을 찾았다. 아마도 누구나 그것을 사용할 수있을 것이다.

string batchContent = "/c \"@ECHO OFF & timeout /t 6 > nul & start \"\" \"$[APPPATH]$\" & exit\"";
batchContent = batchContent.Replace("$[APPPATH]$", Application.ExecutablePath);
Process.Start("cmd", batchContent);
Application.Exit();

코드가 단순화되었으므로 예외 및 항목을 처리하십시오.)


2

현재 실행중인 인스턴스에 전달 된 명령 줄 옵션 / 매개 변수를 잊어 버렸습니다. 그것들을 전달하지 않으면 실제 재시작을 수행하지 않습니다. Process.StartInfo프로세스 매개 변수의 복제본으로를 설정 한 다음 시작하십시오.

예를 들어 프로세스가로 시작된 경우 myexe -f -nosplash myfile.txt메서드는 myexe모든 플래그 및 매개 변수없이 만 실행 됩니다.


2

이전 애플리케이션이 종료 된 후 새 애플리케이션이 시작되기를 원했습니다.

process.WaitForExit ()를 사용하여 자체 프로세스가 종료 될 때까지 기다리는 것은 의미가 없습니다. 항상 시간 초과됩니다.

따라서 내 접근 방식은 Application.Exit ()를 사용하고 기다릴 수 있지만 일정 기간 동안 이벤트가 처리되도록 허용하는 것입니다. 그런 다음 이전과 동일한 인수로 새 애플리케이션을 시작하십시오.

static void restartApp() {
    string commandLineArgs = getCommandLineArgs();
    string exePath = Application.ExecutablePath;
    try {
        Application.Exit();
        wait_allowingEvents( 1000 );
    } catch( ArgumentException ex ) {
        throw;
    }
    Process.Start( exePath, commandLineArgs );
}

static string getCommandLineArgs() {
    Queue<string> args = new Queue<string>( Environment.GetCommandLineArgs() );
    args.Dequeue(); // args[0] is always exe path/filename
    return string.Join( " ", args.ToArray() );
}

static void wait_allowingEvents( int durationMS ) {
    DateTime start = DateTime.Now;
    do {
        Application.DoEvents();
    } while( start.Subtract( DateTime.Now ).TotalMilliseconds > durationMS );
}

2

Restarter 를 사용할 수도 있습니다 .

Restarter는 충돌하거나 중단 된 프로그램 및 응용 프로그램을 자동으로 모니터링하고 다시 시작하는 응용 프로그램입니다. 원래 게임 서버를 모니터링하고 다시 시작하기 위해 개발되었지만 모든 콘솔 또는 양식 기반 프로그램 또는 응용 프로그램에 대한 작업을 수행합니다.


1
제공된 링크는 더 이상 작동하지 않지만 CNET에서 동일한 응용 프로그램이라고 생각합니다. download.cnet.com/Restarter/3000-2094_4-75810552.html
Surfbutler

2
public static void appReloader()
    {
        //Start a new instance of the current program
        Process.Start(Application.ExecutablePath);

        //close the current application process
        Process.GetCurrentProcess().Kill();
    }

Application.ExecutablePath 가 응용 프로그램 .exe 파일 경로를 반환합니다. 호출 순서를 따르십시오. try-catch 절에 배치 할 수 있습니다.


1

bat 파일을 만들고 닫기 전에 배치 파일을 실행 한 다음 현재 인스턴스를 닫는 방법은 어떻습니까?

배치 파일은 다음을 수행합니다.

  1. 프로세스가 종료되었는지 확인하기 위해 루프에서 기다립니다.
  2. 프로세스를 시작하십시오.

가난한 사람의 감시 응용 프로그램이며 위에서 조금 더 자세히 설명합니다. 실제 워치 독 애플리케이션의 주요 이점은 원래 앱이 작동하지 않고 죽더라도 처리 할 수 ​​있다는 것입니다.
아담 Nofsinger

@AdamNofsinger 나는 지금 본다. 나는 그 코멘트를 놓쳤다. 사용하는 솔루션으로 게시물을 편집 할 수 있습니다.
AZ.

1

여기 내 2 센트입니다.

새 인스턴스 시작-> 현재 인스턴스 닫기 시퀀스는 여러 복사본을 동시에 실행하는 것을 허용하지 않는 응용 프로그램에서도 작동해야합니다.이 경우 새 인스턴스에 다시 시작이 진행 중임을 나타내는 명령 줄 인수를 전달할 수 있습니다 따라서 실행중인 다른 인스턴스를 확인할 필요가 없습니다. 두 인스턴스가 병렬로 실행되지 않는 것이 절대적으로 필수적인 경우 첫 번째 인스턴스가 실제로 구현을 완료 할 때까지 기다립니다.


1

Process를 사용하여 전체 응용 프로그램을 다시 시작하는 것이 잘못된 방식으로 문제에 접근하는 것이 두렵습니다.

더 쉬운 방법은 Program.cs 파일을 수정하여 다시 시작하는 것입니다.

    static bool restart = true; // A variable that is accessible from program
    static int restartCount = 0; // Count the number of restarts
    static int maxRestarts = 3;  // Maximum restarts before quitting the program

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        while (restart && restartCount < maxRestarts)
        {
           restart = false; // if you like.. the program can set it to true again
           restartCount++;  // mark another restart,
                            // if you want to limit the number of restarts
                            // this is useful if your program is crashing on 
                            // startup and cannot close normally as it will avoid
                            // a potential infinite loop

           try {
              Application.Run(new YourMainForm());
           }
           catch {  // Application has crashed
              restart = true;
           }
        }
    }

1
이 솔루션을 사용하면 응용 프로그램을 X 번 다시 시작한 다음 무한 루프를 방지하기 위해 응용 프로그램을 종료 할 수 있습니다.
RooiWillie

감사합니다 @RooiWillie 프로그램이 정상적으로 종료 할 수없는 경우를 대비하여 카운터를 추가했습니다.
Andrew

0

비슷한 문제가 있었지만 24/7 실행해야하는 앱에서는 찾을 수없는 관리 할 수없는 메모리 누수와 관련이있었습니다. 고객과 함께 메모리 사용량이 정의 된 값을 초과하면 앱을 다시 시작할 수있는 안전한 시간이 오전 3 시라는 데 동의했습니다.

시도 Application.Restart했지만 이미 실행중인 동안 새 인스턴스를 시작하는 메커니즘을 사용하는 것 같기 때문에 다른 계획을 시도했습니다. 나는 파일 시스템이 그들을 생성 한 프로세스가 죽을 때까지 처리하는 트릭을 사용했다. 그래서 응용 프로그램에서 파일을 디스크 Dispose()에 놓았고 핸들 이 없었 습니다. 파일을 사용하여 '내 자신'실행 파일과 시작 디렉터리도 전송했습니다 (유연성을 추가하기 위해).

암호:

_restartInProgress = true;
string dropFilename = Path.Combine(Application.StartupPath, "restart.dat");
StreamWriter sw = new StreamWriter(new FileStream(dropFilename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite));
sw.WriteLine(Application.ExecutablePath);
sw.WriteLine(Application.StartupPath);
sw.Flush();
Process.Start(new ProcessStartInfo
{
    FileName = Path.Combine(Application.StartupPath, "VideoPhill.Restarter.exe"),
    WorkingDirectory = Application.StartupPath,
    Arguments = string.Format("\"{0}\"", dropFilename)
});
Close();

Close()결국 앱 종료를 시작하고 StreamWriter여기서 사용한 파일 핸들 은 프로세스가 실제로 종료 될 때까지 열린 상태로 유지됩니다. 그때...

Restarter.exe가 작동합니다. 독점 모드에서 파일을 읽으려고 시도하여 메인 앱이 죽지 않을 때까지 액세스 권한을 얻지 못하게 한 다음 메인 앱을 시작하고 파일을 삭제하고 존재합니다. 더 간단 할 수 없다고 생각합니다.

static void Main(string[] args)
{
    string filename = args[0];
    DateTime start = DateTime.Now;
    bool done = false;
    while ((DateTime.Now - start).TotalSeconds < 30 && !done)
    {
        try
        {
            StreamReader sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite));
            string[] runData = new string[2];
            runData[0] = sr.ReadLine();
            runData[1] = sr.ReadLine();
            Thread.Sleep(1000);
            Process.Start(new ProcessStartInfo { FileName = runData[0], WorkingDirectory = runData[1] });
            sr.Dispose();
            File.Delete(filename);
            done = true;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Thread.Sleep(1000);
    }
}

0

나는 다음을 사용하고 정확히 원하는 것을 수행합니다.

ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
UpdateCheckInfo info = null;
info = ad.CheckForDetailedUpdate();
if (info.IsUpdateRequired)
{
    ad.UpdateAsync(); // I like the update dialog
    MessageBox.Show("Application was upgraded and will now restart.");
    Environment.Exit(0);
}

0

로그 아웃으로 사용하려면 Ram Cache에서 모든 앱을 종료해야하므로 먼저 애플리케이션을 닫은 다음 다시 실행해야합니다.

// 로그 아웃 버튼 클릭시

foreach(Form frm in Application.OpenForms.Cast<Form>().ToList())
        {
            frm.Close();
        }
System.Diagnostics.Process.Start(Application.ExecutablePath);

0

Application.Restart () 사용의 문제는 새 프로세스를 시작하지만 "이전"프로세스가 여전히 남아 있다는 것입니다. 따라서 다음 코드 스 니펫을 사용하여 이전 프로세스를 종료하기로 결정했습니다.

            if(Condition){
            Application.Restart();
            Process.GetCurrentProcess().Kill();
            }

그리고 그것은 잘 작동합니다. 제 경우에는 MATLAB과 C # 응용 프로그램이 동일한 SQLite 데이터베이스를 공유하고 있습니다. MATLAB이 데이터베이스를 사용하는 경우 MATLAB이 데이터베이스에서 사용중인 비트를 재설정 할 때까지 Form-App을 다시 시작해야합니다 (+ 카운트 다운). (부수 정보 만)


0

코드를 함수 안에 넣을 수 있으며 재시작이 필요할 때 함수를 호출 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.