Microsoft MVP성태의 닷넷 이야기
클릭원스로 배포 한 프로젝트가 끝났는지 알 수 있는 방법 [링크 복사], [링크+제목 복사]
조회: 10948
글쓴 사람
heyhey (jeanie1oo at naver.com)
홈페이지
첨부 파일
 

안녕하세요 성태님

성태님 덕분에 Clickonce에 대해 많이 알게 되었습니다.
그런데, 아직 진행 중에 안되는 것이 있어서 질문 드립니다.

WindowsFormApplication1 에서 Button을 통해 process URL을 지정하여
WindowsFormApplication2를 배포하였습니다.

그 때 WindowsFormApplication1에서 Button을 눌렀을 시
WindowsFormApplication1은 보이지 않는 상태가 되고,
WindowsFormApplication2가 보이게 되며
또 다시 WindowsFormApplication2를 종료 시
WindowsFormApplication1이 다시 보이게끔 하고 싶은데

WindowsFormApplication1에서

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim myProcess As Process
    myProcess = System.Diagnostics.Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " +
                http://xxx.xxx.xx.xx:xxx/WindowsFormApplication2.application)

    Me.Visible = False
    myProcess.WaitForExit()

    Me.Visible = True
End Sub

이렇게 줬는데 WaitForExit() 명령어가 아예 WindowsFormApplication2 란 것을 인지 못하는 것 같습니다.
어떻게 해야할까요?

디버깅결과 Me.Visible이 False 변했다가 바로 True 로 바뀝니다.
WaitForExit()는 로컬컴퓨터에서만 실행시킨 파일을 종료되었는지만 확인 할 수 있더군요.
배포는 로컬컴퓨터에 했지만 실행은 서버에 있는 application을 실행했기 때문인가봅니다.
서버에서 실행시킨 파일도 WaitForExit() 할 수 있을까요?

WaitForExit() 대신 hasExited도 사용해봤습니다.


Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim myProcess As Process
    myProcess = System.Diagnostics.Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " +
                http://xxx.xxx.xx.xx:xxx/WindowsFormApplication2.application)

    Me.Visible = False

    If myProcess.hasExited = True then
        Me.Visible = True
    end if
End Sub

역시 안되더군요.
hasExited도 로컬컴퓨터내에서만 사용가능하더군요.

그래서 방법을 다르게 생각해봤습니다.
어짜피 Clickonce로 배포는 이미 했고, C:/Users/xxxx/AppData/Local/Apps/2.0/ 여기에 배포가 되니
내가 실행시킨 WindowsFormApplication2.exe 가 종료 되었을 때 Visible = True 로 변경하면 되겠구나.

근데 생각한대로 코딩이 안떠오르네요.
실행한 프로젝트 이름을 찾는 명령어도 그렇고
그 실행프로젝트가 종료 되었을 때 하는 명령어도 모르겠네요.

단지, 서버에서 실행시킨 파일이 종료되었을때 Me.Visible을 True로 바꾸고싶어서
구글링을 해봐도 제가 원하는 답은 나오질 않네요ㅠ

=================================================================================================

Msgbox(myprocess.ProcessName) 해봤을때
실행 프로그램이 WindowsApplication2.exe 가 아닌 Rundll32로 표시가 되네요
이러니 Rundll32.exe 는 WindowsApplication2.exe 를 키고나서 바로 종료되니
myProcess.WaitForExit()가 바로 되는걸까요?








[최초 등록일: ]
[최종 수정일: 7/31/2017]


비밀번호

댓글 작성자
 



2017-07-31 12시19분
마지막의 질문에 언급한 것처럼, 위의 코드에서 myProcess는 rundll32.exe 프로세스에 대한 것이므로 그 프로세스가 종료하면 WaitForExit가 반환됩니다. 이런 경우에는 서로 간에 협업을 위한 코드를 작성하는 것이 좋겠지만, 그런 것이 안된다면 다음과 같은 식의 방법을 이용해 맞춰주는 수밖에 없습니다.

C# - 특정 EXE 프로세스를 종료시킨 EXE를 찾아내는 방법
; http://www.sysnet.pe.kr/2/0/11172

그 외에 배포된 exe를 찾아서 직접 수행하는 방법은, 아마도 ClickOnce가 해주는 업데이트 혜택을 받지 못하므로 그에 대한 처리를 고려해야 할 것입니다.
정성태
2017-08-01 05시59분
[heyhey] Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim myProcess As Process
    myProcess = System.Diagnostics.Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " +
                http://xxx.xxx.xx.xx:xxx/WindowsFormApplication2.application)

    Me.Visible = False
    myProcess.WaitForExit()

    Me.Visible = True
End Sub
[guest]
2017-08-01 06시05분
[heyhey] 제가 어제 하루종일 고민해서 낸 답은 Application2.exe 프로세스를 실행중인 프로세스 목록에서 찾아서 WaitForExit()를 하는 방법입니다.
그래서
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim myProcess As Process
    myProcess = System.Diagnostics.Process.Start("rundll32.exe", "dfshim.dll,ShOpenVerbApplication " +
                http://xxx.xxx.xx.xx:xxx/WindowsFormApplication2.application)

     Me.Visible = False
     Threading.Thread.Sleep(2000)

            Dim myProcesses() As Process
            Dim myProcess_ As Process
            myProcesses = Process.GetProcesses()

            For Each myProcess_ In myProcesses
                If myProcess_.ProcessName.Equals("WindowsFormApplication2") Then
                    myProcess_.WaitForExit()
                    Threading.Thread.Sleep(1000)
                    Me.Visible = True
                    Exit For
                End If
            Next
End Sub

WindowsFormApplication2를 실행할 때 Clickonce 연결하는시간 한2초정도 걸리더군요.
그래서 Thread를 2초 지연시켰습니다.
그런다음 실행중인 프로세스 배열을 만들어 WindowsFormsApplication2 라는 이름이 있는지 비교를 하나하나해서
종료시켰더니 제가 원하는 방향으로 잘 됬습니다.

그런데, 이건 너무 비효율적인 것 같습니다.
일단 컴퓨터 사양에 따라 Clickonce가 2초가 걸릴지 몇초가 걸릴지도 모르는거고,
만약 배포할 컴퓨터에 WindowsFormsApplication2 가 없다면 설치하는 시간만 2초가 넘어가서 실행이 안됩니다.

댓글을 봤는데 협업을 위한 코드를 작성하라 하셨는데 무슨말인 잘 모르겠습니다.
특정 EXE 프로세스를 종료시킨 EXE를 찾아내는 방법도요..
아직 개발 초보자라...ㅠ
[guest]
2017-08-01 07시11분
[heyhey] 아닙니다 성태님
방금 엄청 쉬운방법으로 해결했네요ㅠ
굳이 쓰레드를 지연시킬필요가 없었네요...
하 이걸 하루종일 고민하다니 ㅠ
[guest]
2017-08-01 07시15분
[heyhey] 아 아니네요 - -;
해결된게 아니였네...하 역시 이렇게 쉽게 될리가 없겠죠...
[guest]
2017-08-01 12시52분
협업이란 것은 다른 의미가 아니고, Event Signal 같은 것을 통해서 알려주는 코드를 서로 간에 해놓아야 한다는 것입니다.

세 번째 덧글의 방법대로 할 거라면, Process.GetProcessesByName을 사용해서 무한 루프(하지만 최대 10초 정도) 동안 Thread.Sleep을 100ms 정도 간격으로 새로 뜬 프로세스를 확인하도록 하고 WaitForExit를 주는 것도 좋을 것입니다. 암튼, 이런 식에서는 깨끗한 방법이 없습니다.
정성태
2017-08-02 02시21분
[heyhey] 제가 글로만 봐서는 이해가 안가는데 예제로 간단하게 설명해 주실 수 있으신가요?
서로간에 알려주는 코드를 작성해야한다하셨는데
Button1을 클릭할때 핸들러로 임의의 코드를 생성해서
그 코드가 맞으면 WaitForExit() 한다는건가요?

================================================

그리고 깨끗하진 않지만,
성태님 말씀대로 Process.GetProcessesByName을 사용해서
무한 루프를 주려고 하는데

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myProcess As Process
            myProcess = System.Diagnostics.Process.Start(sFileName, "dfshim.dll,ShOpenVerbApplication " + "http://xxx.xxx.xx.xx:xxxx/WindowsFormsApplication2.application)

            Me.Visible = False
            Threading.Thread.Sleep(2000)

            Dim myProcesses() As Process
            Dim myProcess2 As Process
            myProcesses = System.Diagnostics.Process.GetProcessesByName("WindowsFormApplication2")
            ' Iterate through the process array.

            Dim i As Integer
            For i = 1 To 50 Step 1
                For Each myProcess2 In myProcesses
                    If myProcess2.ProcessName.Equals("WindowsFormApplication2") Then
                        myProcess2.WaitForExit()
                        Threading.Thread.Sleep(800)
                        Me.Visible = True
                        Exit For
                    Else
                        Threading.Thread.Sleep(1000)
                    End If
                Next
            Next

이렇게 50초까지만 무한루프를 주려고했는데
결과가 이상하게 나오네요.

공부도 할 겸 2가지 방법 다 해보려고하는데
간단한 예제로 도움을 주실 수 있으신지.. 부탁드립니다
[guest]
2017-08-02 01시28분
실행하는 프로세스에서 new EventWaitHandle(...,"Test",...)라는 식으로 생성해 두고, 해당 이벤트를 대기한 다음 실행되는 프로세스에서 EventWaitHandle.OpenExisting("Test")으로 열어 Event.Set을 해주면 실행되었는지 알 수 있습니다. 마찬가지로 종료는 반대 과정으로 하면 알 수 있을 것입니다. (따라서, 실행하는 측과 실행되는 측의 코드가 함께 변경되어야 합니다.)

두번째는, 대략 아래와 같은 식으로 하면 될 것입니다.

int retry = 10;

while (retry-- > 0)
{
    var proc = Process.GetProcessesByName("WindowsFormApplication2");
    if (proc.Count == 0) { Thread.Sleep(500); continue; }
  
    proc[0].WaitForExit();
}
정성태

1  2  3  4  5  6  7  8  9  10  11  12  13  [14]  15  ...
NoWriterDateCnt.TitleFile(s)
5589초급12/22/20214717c# -> 라즈베리파이(db 접속)시 에러 발생 [7]
5588김지신12/21/20214672안녕하세요 String 변수 참조 주소 질문입니다. [2]
5587이완호12/17/20215765C# SharpDX 화면 캡쳐 관련해서 질문 드립니다. [1]
5586조미김12/16/20214935윈폼에서 메인 스레드와 UI 스레드의 차이점 질문드립니다 [4]
5585김준희12/16/20215700C# 윈폼 TCP/IP 데이터 연속으로 보낼때 [1]
5583난인간이다12/10/20214754.net 6 dynamic pgo 활성화 및 예상되는 문제 [1]
5582김준희12/9/202111900C# TCP/IP 통신시 연결 끊김 에러 [1]
5581김시준12/9/20215274닷넷에서 파일 delete 함수는 왜 비동기가 없는 것인가요? [2]
5580카짜프로...12/7/20216526패턴매칭 -튜퓰비교에 관한 오류사항과 궁금증 [1]파일 다운로드1
5579카짜프로...12/6/2021578511.12 메서드 중복정의에 대한 질문 [1]
5577감사합니...11/30/20214808visual studio 2015 update 3를 다운받을려고 하는데 x64/x86 차이점이 뭘까요? [2]
5576노홍구11/29/20214706C# 으로 USB 스캐너 프린터 리셋하기 입니다. [1]
5575베라11/23/20214770event handler 관련 문의 [2]
5574박원웅11/22/20215080닷넷 프레임워크 산출물의 배포시 해당 환경에 프레임워크 버전이 설치되어 있지 않는 경우를 고려한 배포방법은? [3]
5573mijin11/21/20214903System.NullReferenceException 에 대한 질문 [1]
5572김현진11/21/20215070C# list.Clear() 호출에 대한 문의 드립니다. [4]
5571한예지 donator11/18/20215013무설치 프로그램 원리가 궁금합니다. [2]
5570초보11/16/20215511주식데이터 초당 수신 건수를 구하고 있는데 처리속도가 느려서요 [2]
5569카짜프로...11/14/20216400381페이지 UTC에대한 언급이 그리니치 천문대 시간으로 되어있는게 맞나요? [1]
5568카짜프로...11/14/20216471그림 5.20, 그림 5.22 언급 오류 [1]
5567Edun11/2/20215369쿼리문을 코드로 어떻게 처리할 수 있을까요? [2]
5566민성10/26/20215197Linq에 관해서 [1]
5565pass...10/25/20216472wpf에서 Cefsharp를 AnyCPU로 작업 했는데 실행이 되지 않습니다. [4]
5564초보10/21/20214699오버라이드 관련 질문드립니다 [2]
5562서지훈10/20/20214694win32 api 문의 드립니다. (EnableMenuItem) [5]
5561Edun10/15/20215134도와주세요!! 팝업 띄우는 더블클릭 이벤트!! 부탁드립니다 ㅠㅠ [4]파일 다운로드1
1  2  3  4  5  6  7  8  9  10  11  12  13  [14]  15  ...