Microsoft MVP성태의 닷넷 이야기
클릭원스로 배포 한 프로젝트가 끝났는지 알 수 있는 방법 [링크 복사], [링크+제목 복사]
조회: 4077
글쓴 사람
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
[손님]
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를 찾아내는 방법도요..
아직 개발 초보자라...ㅠ

[손님]
2017-08-01 07시11분
[heyhey] 아닙니다 성태님
방금 엄청 쉬운방법으로 해결했네요ㅠ
굳이 쓰레드를 지연시킬필요가 없었네요...
하 이걸 하루종일 고민하다니 ㅠ
[손님]
2017-08-01 07시15분
[heyhey] 아 아니네요 - -;
해결된게 아니였네...하 역시 이렇게 쉽게 될리가 없겠죠...
[손님]
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가지 방법 다 해보려고하는데
간단한 예제로 도움을 주실 수 있으신지.. 부탁드립니다
[손님]
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)
5012황윤하7/13/20182030SMTP 예외처리 관련 질문 [1]
5011손님7/9/20186232c#에서 c++ DllImport 문의 입니다. [1]파일 다운로드2
5010C# 꿈나무7/8/20182446C# WebService 에서 질문이 있습니다. [1]
5009C#초보자7/5/20182427[C#] 감시 프로그램을 제작했는데, 작동은 하나 폼이 멈춰버렵니다... [1]파일 다운로드1
5008도와주세요7/5/20182402 리스트 아이템의 타입을 추출해서 다시 재활용하고 싶어요.2 [6]파일 다운로드1
5007도와주세요7/4/20182668리스트 아이템의 타입을 추출해서 다시 재활용하고 싶어요. [1]
5006정환나라7/4/20183203소켓 통신과 쓰레드에 관해 질문드립니다 [4]
5005psh7/4/20182340인용에 관련해 문의 드립니다 [1]파일 다운로드2
5004까오리7/4/20181904iis8.0에서 닷넷1.1을 사용하기 위한 질문입니다. [1]
5002멋쟁이7/2/20181847WPFApp에 관한 초보 질문입니다. [1]파일 다운로드1
5001김학완7/1/20182186시작하세요 C# 7.1 프로그래밍 P53쪽 질문입니다. [2]
5000레몬6/26/20182518안녕하세요 성태님 도움으로 C# 네이버 카페 스팸글 작성되면 삭제되는 프로그램을 만들었는데요..여쭤볼게 하나 있습니다. [3]
4999jt6/21/20182354검색어 입력, 엔터 > 페북 로그인창으로 이동합니다. [4]
4998개발희망6/11/20182268C# 형변환 질문있습니다! [1]
4997초보개발자6/5/20188266C++ dll C#에서 사용하는데 보호된 메모리 오류떠요 한번만 도와주세요ㅜ [2]파일 다운로드1
4996swc6/5/20182755현업에서 주로 사용하는 DB업데이트 방법 질문입니다. [1]파일 다운로드1
4993학생6/3/20182213질문 드립니다 [1]
4991최진안5/24/20182248Credential Provider 질문 [2]
4990heygongc5/21/20182259Sybase Adaptive Server Anywhere 6 버전에 대한 질문입니다. [7]
4989강한음5/18/20183285clickonce 배포 후 실행 무응답 [2]
4988C#7.1책구매자5/17/20182252dynamic 키워드를 사용한 객체 핸들링에 대해서 여쭤보려고 합니다. [1]
4987포플러5/14/20183145닥터왓슨 로그 - c0000005 (액세스 위반) 분석 부탁드려도 될까요? [2]
4986익명5/14/20183515비주얼 스튜디오 wpf 프로젝트에서 어떻게 하면 exe파일과 실행에 필요한 파일들을 분리해서 정리해서 디렉토리로 묶을 수 있을까요? [4]
4985대구개발자5/7/20182522새로운 폴더만 "이름 없는 파일" 오류 [1]
4984안중언5/6/20183080교재 143page [1]
4983익명5/4/20187262(wpf) 다른 컴퓨터에서 사용하면 자꾸 ('CefSharp.Core.dll' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다)라고 떠요.ㅠㅠ [5]
1  2  3  4  5  6  7  8  9  10  11  12  13  14  [15]  ...