Microsoft MVP성태의 닷넷 이야기
클릭원스로 배포 한 프로젝트가 끝났는지 알 수 있는 방법 [링크 복사], [링크+제목 복사]
조회: 10938
글쓴 사람
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)
5726양승조9/22/20224739C# dll 과 C++ 간 배열 전달. SafeArray [10]파일 다운로드1
5725김기헌9/21/20223629안녕하세요 선생님 윈폼 컨트롤 Dispose 관련 질문드립니다 [2]
5724감사합니...9/19/20223653스레드와 스레드 안전한 객체 사용관련 문의드립니다. [5]
5723드리렁9/13/20223588Pinned Object에 대해서 질문이 있습니다. [2]
5722김인태9/8/20223742대화상자에서 alt + tab 후킹 작업 [1]
5721우종9/7/20223889C++ DLL 과 C# 연동 문의 [2]
5720한예지 donator9/6/20223611학습 방법 질문 있습니다. [7]
5719김경한9/6/20223930안녕하세요 질문하나만드리겠습니다...! [10]
5718김민아9/2/20223968안녕하세요 생성자 호출 시 초기화 순서 질문드립니다 [2]
5716iili...8/26/20224155WinDbg 커널 디버깅에서의 thread freeze [2]
5715에릭8/19/20224564WMI 쿼리 결과값이 Windows Service와 Console 출력에서 상이한 이유가 있을까요? [9]파일 다운로드1
5714허니빠8/18/20224624.net6 hint path 를 프로젝트 단위로 지정할 수 있는 방법을 알고싶습니다 [8]
5713김기헌8/17/20224563안녕하세요 rgb 계산 오차가 있는데 원인을 모르겠습니다.. [3]
5712하태8/17/20223992안녕하세요 background service에서 user32dll 접근 질문 드리겠습니다.! [2]
5711하태8/16/20223530안녕하세요! 윈도우즈 해상도 관련 질문 드립니다. [1]
5710장성욱8/12/20223746c# 시리얼 통신 관련 질문 [3]
5709초보8/12/20223556WPF 커맨드 관련 질문 [2]
5708민성8/11/20223796안녕하세요 c#에서 화면의 배율 및 레이아웃을 변경할려면 어떻게 해야 할까요? [2]파일 다운로드1
5707민성8/10/20223454WPF 엣지 컨트롤에서 화면이 안보이는 현상 [2]파일 다운로드1
5706종규8/7/20225853WPF 에서 SVG 아이콘 사용 방법 문의 [2]
5705김기헌8/6/20224570안녕하세요 선생님 싱글톤 패턴 간단 질문 [2]
5704따봉이8/4/20224452EventHandler 관련 [1]
5703조민준8/3/20223867안녕하세요 정적 멤버 초기화 관련 간단한 질문 [2]
5702석우8/3/20223800C# WPF Ribbon IsMinimized 프로퍼티 변경 감지 방법문의 [2]파일 다운로드1
5701김기헌8/1/20224009foreach 문으로 컬렉션을 열거할 때 궁금한 점 [2]
5699갓경섭7/29/20224411C# 프로그램 느려짐 현상 [2]
1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...