将.NET类限制为计算机边界上的单个对象实例=> “进程间单身人士”

时间:2009-08-08 19:57:49

标签: c# .net interprocess

我希望在同一台计算机上有多个进程使用的某个.NET类的一个对象。

拥有应用程序域,不可能跨越该边界,但.NET 4.0中的内存映射文件应该以某种方式缓解该任务。

直到.NET 4.0进入最终版本...... 是否有可能在C#中制作某种“进程间单例”?

3 个答案:

答案 0 :(得分:4)

是的,你可以在一个进程中创建一个.Net Remoting单例,并通过Remoting将它暴露给在同一台机器上运行的其他进程......

编辑:在.Net 2.x中,您需要使用Remoting解决方案,但在.Net 3.x或更高版本(其中WCF可用)中,使用WCF可以 使用相同的功能 (看看)......

答案 1 :(得分:2)

您可能想要使用全局互斥锁。

Threading in C#有一个很好的例子(为方便起见,下面是复制的)关于如何使用命名的互斥锁来确保只有一个应用程序的一个实例可以在一台机器上运行。

您可以展开此示例以确保只有一个对象实例。

class OneAtATimePlease {
  // Use a name unique to the application (eg include your company URL)
  static Mutex mutex = new Mutex (false, "oreilly.com OneAtATimeDemo");

  static void Main() {
    // Wait 5 seconds if contended – in case another instance
    // of the program is in the process of shutting down.

    if (!mutex.WaitOne (TimeSpan.FromSeconds (5), false)) {
      Console.WriteLine ("Another instance of the app is running. Bye!");
      return;
    }
    try {
      Console.WriteLine ("Running - press Enter to exit");
      Console.ReadLine();
    }
    finally { mutex.ReleaseMutex(); }
  }
}

还有一件事你可能需要注意。

在终端服务中运行的服务器上使用命名互斥锁时,命名的互斥锁可以具有两级可见性,全局到所有会话(名称前缀为“Global\”)或本地到终端服务器会话(名称前缀为“Local\”,如果未指定前缀,则为默认值)。

您可以在MSDN: Mutex Class中找到有关互斥锁的更多详细信息。

答案 2 :(得分:0)

在全局程序集缓存中安装.net dll。然后它可以被计算机上的任何应用程序引用。