2009-07-14 3 views
5

C# 3.5 (SP 1)에는 WinForms 응용 프로그램이 있습니다. 우리는 여러 창 인스턴스가있는 메모리에서 하나의 프로세스로 응용 프로그램을 제한하려고합니다. 우리는 MDI 접근법을 찾지 않고 여러 응용 프로그램 프로세스를 시작하지 않고 별도의 기본 폼 인스턴스를 갖기 위해 노력하고 있습니다. 우리는 윈도우 메시지 및 최우선 WinProc으로 처음 2 (PInvoke를위한 거친 세부 사항을 WinForm 응용 프로그램을 여러 인스턴스가있는 하나의 프로세스로 제한

  • WCF
    1. 윈도우 메시지
    2. COM :

      우리는 세 가지 방법을 평가 COM 레지스트리 등), 오래된 기술을 사용합니다.

      우리는 명명 된 파이프 대신 WCF를 사용하는 아이디어에 대해 논의했으며이 작업을 수행하는 가장 깨끗하고 쉬운 방법이라고 생각합니다.

      응용 프로그램을 여러 주 양식 인스턴스가있는 하나의 프로세스로 제한하는 가장 깨끗하고 현대적인 방법은 무엇입니까?

    +0

    에 간 응용 프로그램 또는 시스템 간 통신을 할 수있는 현대적인 방법으로 내가 WCF를 사용하는 것과 다른 형태/응용 프로그램 도메인 간의 통신을위한

    그리고 Windows 메시지는 이것과 관련이 있습니까? –

    +0

    누군가가 COM에 레지스트리에 첫 번째 응용 프로그램을 등록한 다음 응용 프로그램이 기존 응용 프로그램을 호출하기 위해로드 할 때이를 쿼리합니다. 다른 아이디어는 WinProc을 오버로드하고 WM_COMMAND를 호출하여 대화 상자의 인스턴스를 만드는 것입니다. WCF는 우리를 위해 명명 된 파이프를 만듭니다. 적어도 저것은 거기 던져진 무슨이다. – blu

    +0

    좋습니다. 두 번째 인스턴스를 실행할 때 이미 실행중인 응용 프로그램 인스턴스에 새 창을 만드는 방법을 알려주는 것이 좋습니다. 창 메시지는 정상적으로 작동하지만 WCF는 인터페이스, 매개 변수, 구성에 대해보다 다양한 기능을 제공하므로 훨씬 더 깨끗합니다. – mlessard

    답변

    3

    내가 과거에 사용한 방법 중 하나는 시스템 뮤텍스 개체를 사용하는 것이 었습니다. 그 뒤에있는 이론은 응용 프로그램의 첫 번째 인스턴스가 뮤텍스 개체를 생성하고 응용 프로그램의 후속 인스턴스가 미리 정의 된 뮤텍스에 대한 핸들을 열려고 시도하며 존재하는 경우 bamo! 두 번째 및 세 번째 및 네 번째 .... 인스턴스를 종료하십시오.

    public static void CheckSingleInstance() 
    { 
        bool created = false; 
        _singleInstance = new Mutex(true, "PredefinedMutexName##1", out created); 
    
        if (!created) 
        { 
         MessageBox.Show("Another instance of this application is already running. Click OK to switch to that instance.", "Application running", MessageBoxButtons.OK, MessageBoxIcon.Information); 
    
         Process proc = Process.GetCurrentProcess(); 
         Process[] procs = Process.GetProcessesByName(proc.ProcessName); 
         bool exit = false; 
         Process process = null; 
         foreach (Process p in procs) 
         { 
          if (p.Id != proc.Id && p.MainModule.FileName == proc.MainModule.FileName) 
          { 
           // ShowWindow(p.MainWindowHandle, 1/*SW_SHOWNORMAL*/); 
           process = p; 
           exit = true; 
          } 
         } 
         if (exit) 
         { 
          Application.Exit(); 
    
          if (process != null) 
           NativeMethods.SetForegroundWindow(process.MainWindowHandle); 
    
          return; 
         } 
        } 
    } 
    
    1

    질문은 명확하지 않습니다. 애플리케이션을 하나의 인스턴스로만 제한하는 방법을 이미 알고 있으며 기본 폼의 여러 인스턴스를 독립적으로 실행하지만 동일한 프로세스 내에서 수행하기를 원한다고 알고 있습니다. 그런 다음 의사 소통을위한 최선의 방법을 찾고 있습니까?

    이렇게하려면 몇 가지를 만들려면 Application Domains 과정에서. 이렇게하면 각 양식이 자체 프로세스에서 실행되는 것처럼 격리 할 수 ​​있습니다. 그들은 별도의 주소 공간을 사용하고 독립적으로 중지 할 수 있으며 한 도메인의 코드는 다른 도메인의 코드 (결함 등)에 영향을 줄 수 없습니다. 이 프로세스 간 또는 COM, WCF을 무엇 .NET 프레임 워크

    관련 문제