Microsoft MVP성태의 닷넷 이야기
클릭원스로 배포 한 프로젝트가 끝났는지 알 수 있는 방법 [링크 복사], [링크+제목 복사]
조회: 10939
글쓴 사람
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();
}
정성태

... 16  17  18  19  20  21  22  [23]  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
5344하태6/2/20206915c++ .ilb에서 c# dll 호출 질문 드리겠습니다 (콜백함수 전달) [4]
5343하태6/2/20209863안녕하십니까! c# dll을 c++ .lib에서 호출 질문 드립니다. [6]
5342진우5/30/202010986c++ 에서 C# DLL 사용 문의 [2]
5341미나리5/28/20206765스레드 lock키워드 관련 질문드립니다 [3]
5339민성5/27/20206054WPF cmd을 실행을 할때 파라미터 넘기는 방법 [1]
5338서영준5/26/20207955.Net Core Blazor 서버에 Xing API를 이용한 통신 요청 [5]파일 다운로드1
5337ogos...5/26/20208073C# DB connection string 보호 방법에 대하여 [2]
5336saki5/21/20207981이벤트 뷰어 .NET Runtime 오류 [3]
5335민성5/21/20206250안녕하세요 C#으로 컴퓨터 시작프로그램 목록을 가져와서 사용안함으로 바꿀려면 [1]
5334민성5/19/20206595안녕하세요 WPF 콘솔창을 띠우면서 Ping이라는 명령어가 콘솔에 Write되게 할려면 어떻게 해야 하나요?? [1]
5333초보5/18/20206653공유 메모리 관련 문의 [2]
5332질문요5/15/20206530TcpListener TcpClient 문의 [4]
5331sdd5/13/20206353안녕하세요 Settings관련하여 질문드립니다. [2]파일 다운로드1
5330하태5/7/202010656안녕하세요! 질문 드리겠습니다! C# dll에서 c++ CLR프로젝트를 참조 추가 할 수 있나요? [2]
5329김태령4/21/20206270젠킨스에서 원격 머신에 있는 실행 파일을 실행하면 백그라운드로 뜹니다 [2]
5328crea...4/17/20206323안녕하세요! [3]파일 다운로드1
5327김동욱4/17/20206565HttpListener 사용시 HTTP/2 질문입니다. [2]
5323나그네4/15/20205843해결 115p 네임스페이스의 ConsoleApp1.exe는 netcoreapp3.1 폴더에 있었습니다. [1]파일 다운로드1
5322나그네4/14/20206803질문 115p 네임스페이스의 ConsoleApp1.exe 컴파일 또는 빌드방법 [2]파일 다운로드1
5321나그네4/14/20207753오타인가요? [2]
5320kiki...4/10/20209830C# Serial 통신 관련 질문 입니다. [5]
5319권대현4/10/20206110C++(UWP)Dll에서 C#(UWP)Dll 호출이 가능한가요? [1]
5318이승준4/9/20206967동영상 관련 업계 근황? 입니다. [1]
5317kskk...4/7/20208972OpenCV 이용 해상도 설정 질문 입니다.. [3]
5316윤현수4/7/20206173pipe 비동기방식 질문 [1]파일 다운로드1
53154/6/20206841dll파일 로드 원리? 부분에서 도움받고싶습니다. [3]
... 16  17  18  19  20  21  22  [23]  24  25  26  27  28  29  30  ...