2009-07-14 24 views
5

Chúng tôi có một ứng dụng WinForms trong C# 3.5 (SP 1). Chúng tôi muốn hạn chế các ứng dụng cho một quá trình trong bộ nhớ với nhiều trường hợp cửa sổ. Chúng tôi không tìm kiếm một cách tiếp cận MDI, nhưng để có các cá thể biểu mẫu chính riêng biệt mà không cần khởi chạy nhiều quy trình ứng dụng.Hạn chế ứng dụng WinForm cho một quá trình với nhiều phiên bản

Chúng tôi đang đánh giá ba phương pháp:

  1. của Windows Messages
  2. COM
  3. WCF

Chúng tôi có các chi tiết thô cho người đầu tiên 2 (PInvoke với Windows Messages và winproc trọng, COM Registry, vv) và họ sử dụng các công nghệ cũ hơn.

Chúng tôi đã thảo luận ý tưởng sử dụng WCF với các đường ống được đặt tên thay vào đó và nghĩ rằng đây có thể là cách sạch nhất và dễ dàng nhất để hoàn thành nhiệm vụ trong tầm tay.

Cách sạch nhất, hiện đại để hạn chế ứng dụng cho một quy trình với nhiều phiên bản biểu mẫu chính là gì?

+0

gì COM, WCF và Windows Messages phải làm gì với điều này? –

+0

Ai đó đã đăng xuất ứng dụng đầu tiên với COM trong sổ đăng ký và sau đó truy vấn khi ứng dụng tải để gọi đến ứng dụng hiện có. Ý tưởng khác là quá tải WinProc và PInvoke một WM_COMMAND để tạo ra thể hiện của hộp thoại. WCF sẽ tạo ra một ống tên cho chúng tôi. Ít nhất đó là những gì đã được ném ra khỏi đó. – blu

+0

Ok, tất cả những gì bạn muốn biết là làm cách nào để báo cho ứng dụng đã chạy của ứng dụng tạo một cửa sổ mới khi bạn cố chạy một cá thể thứ hai? Một thông báo cửa sổ sẽ hoạt động tốt, nhưng WCF sẽ linh hoạt hơn, đối với giao diện, tham số, cấu hình và tôi nghĩ nó sẽ sạch hơn. – mlessard

Trả lời

3

Một trong những phương pháp tôi đã sử dụng trong quá khứ là sử dụng đối tượng mutex hệ thống. Lý thuyết đằng sau nó là ví dụ đầu tiên của ứng dụng sẽ tạo ra đối tượng mutex và các cá thể tiếp theo của ứng dụng sau đó cố gắng mở một tay cầm cho mutex được xác định trước và nếu nó tồn tại, thì bamo! thoát ví dụ thứ hai và thứ ba và thứ tư .....

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

Câu hỏi không rõ ràng lắm. Tôi hiểu rằng bạn đã biết cách hạn chế ứng dụng của mình chỉ với một cá thể và bạn muốn một số phiên bản biểu mẫu chính của bạn thực thi độc lập nhưng bên trong cùng một quy trình, phải không? Và sau đó bạn đang tìm kiếm cách tốt nhất để làm cho họ giao tiếp?

Để thực hiện việc này, tôi sẽ tạo một số Application Domains trong quy trình của bạn. Bằng cách này, bạn có thể cách ly từng biểu mẫu giống như nó đang chạy trong quá trình riêng của nó. Họ sẽ sử dụng không gian địa chỉ riêng biệt, có thể được dừng lại một cách độc lập và mã trong một tên miền không thể ảnh hưởng đến mã trong các tên miền khác (lỗi, v.v.).

Đối với thông tin liên lạc giữa các hình thức/lĩnh vực ứng dụng khác nhau Tôi sẽ sử dụng WCF như nó là con đường hiện đại để làm inter-process hoặc giữa các ứng dụng hoặc thông tin liên lạc giữa các máy trong .NET Framework

Các vấn đề liên quan