2009-07-30 34 views
12

Được rồi, vì vậy tôi đã tạo ứng dụng C# của mình, tạo một trình cài đặt cho nó và cài đặt nó trên máy tính của tôi.Giới hạn nhiều phiên bản của một ứng dụng

Vấn đề là, khi người dùng mở ứng dụng exe hai lần, sẽ có hai phiên bản của ứng dụng đang chạy. Tôi chỉ muốn một phiên bản của ứng dụng được chạy bất cứ lúc nào, làm cách nào để tôi thực hiện việc này?

Nhờ sự giúp đỡ của bạn,

Trả lời

9

Kỹ thuật phổ biến của việc này là để tạo ra một tên Mutex và kiểm tra sự hiện diện của nó trên đầu ứng dụng.

Xem this hoặc this.

Mã từ DDJ:

class App : Form 
{ 
    Mutex mutex; 

    App() 
    { 
     Text = "Single Instance!"; 
     mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX"); 
     if (!mutex.WaitOne(0, false)) 
     { 
      mutex.Close(); 
      mutex = null; 
     } 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
      mutex.ReleaseMutex(); 
     base.Dispose(disposing); 
    } 

    static void Main() 
    { 
     App app = new App(); 
     if (app.mutex != null) Application.Run(app); 
     else MessageBox.Show("Instance already running"); 
    } 
} 
+0

Vui lòng hiển thị mã trong câu trả lời. Liên kết đầu tiên đã chết, và những người khác cuối cùng có thể làm theo. – nothingisnecessary

0

Tôi không biết các môi trường mà bạn đang hoạt động, nhưng cái gì đó để ghi nhớ về 'ứng dụng đơn sơ thẩm' là cách bạn định nghĩa đơn sơ thẩm. Nếu ứng dụng có thể chạy trên nhiều máy trạm cùng một lúc, sử dụng nguồn dữ liệu chung, đó có phải là vấn đề không? Tương tự như vậy, tình huống dịch vụ đầu cuối (hoặc tình huống "chạy dưới dạng") là nơi có nhiều người dùng đăng nhập vào cùng một máy tính, bạn có muốn hạn chế ứng dụng theo cách mà chỉ một cá thể cho mỗi người dùng, -máy vi tính? Hoặc bạn không sao với nó chỉ đơn giản là một ví dụ cho mỗi người dùng?

Câu trả lời cho những câu trả lời này có thể dẫn bạn theo một hướng khác. Ví dụ, chúng ta có một ứng dụng 'single-instance' với phạm vi là một nhóm các máy tính. Chỉ một người dùng được phép ở trong nhóm máy trạm đó. Chúng tôi đã quản lý điều này bằng cách có một bảng trong nguồn dữ liệu được chia sẻ của chúng tôi đã theo dõi người dùng được kết nối hiện tại. Đây là vấn đề bảo trì vì bạn cần chắc chắn rằng bảng chính xác 100% mọi lúc. Xử lý những thứ như cúp điện đột xuất trên máy trạm, để lại các bản ghi "không có thật" trong bảng đó đã xử lý cẩn thận.

4

Với nhờ Messrs.AllenPowell:

static void Main() 
    { 
     using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) { 
      if (!mutex.WaitOne(0, false)) { 
       string processName = GetProcessName(); 
       BringOldInstanceToFront(processName); 
      } 
      else { 
       GC.Collect(); 
       Application.Run(new Voting()); 
      } 
     } 
    } 

    private static void BringOldInstanceToFront(string processName) { 
     Process[] RunningProcesses = Process.GetProcessesByName(processName); 
     if (RunningProcesses.Length > 0) { 
      Process runningProcess = RunningProcesses[0]; 
      if (runningProcess != null) { 
       IntPtr mainWindowHandle = runningProcess.MainWindowHandle; 
       NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED); 
      NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE); 
      } 
     } 
    } 
+0

Màn hình hiển thị mã dường như bị tắt bởi @ "Global \" - lời xin lỗi của tôi. – lance

8

tôi giải quyết vấn đề này bằng cách này

[STAThread] 
static void Main() 
    { 

     Process[] result = Process.GetProcessesByName("ApplicationName"); 
     if (result.Length > 1) 
     { 
      MessageBox.Show("There is already a instance running.", "Information"); 
      System.Environment.Exit(0); 
     } 
     // here normal start 
    } 

nó là đơn giản, nhưng tôi đã hầu như không thời gian để kiểm tra xem có giải pháp tốt hơn.

+0

Nếu có ai đó lấy một bản sao của ứng dụng theo một tên khác và bắt đầu như một quá trình mới, sẽ có nhiều trường hợp. Vì vậy, hãy sử dụng một trường 'processObject.MainModule.FileInfo' như mô tả hoặc tên tệp gốc .. không thay đổi ngay cả khi tệp thi hành được đổi tên – Sanjay

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