【发布时间】:2009-08-08 19:57:48
【问题描述】:
我想让同一台计算机上的多个进程使用某个 .NET 类的一个对象。
拥有应用程序域,跨越该边界并不容易,但 .NET 4.0 中的内存映射文件应该以某种方式简化该任务。
直到 .NET 4.0 最终发布... 是否可以在 C# 中制作某种“进程间单例”?
【问题讨论】:
标签: c# .net interprocess
我想让同一台计算机上的多个进程使用某个 .NET 类的一个对象。
拥有应用程序域,跨越该边界并不容易,但 .NET 4.0 中的内存映射文件应该以某种方式简化该任务。
直到 .NET 4.0 最终发布... 是否可以在 C# 中制作某种“进程间单例”?
【问题讨论】:
标签: c# .net interprocess
是的,您可以在一个进程中创建一个 .Net Remoting 单例,并通过 Remoting 将其公开给在同一台机器上运行的其他进程...
编辑:在 .Net 2.x 中,您需要使用 Remoting 解决方案,但在 .Net 3.x 或更高版本(WCF 可用)中,同样的功能可能可使用 WCF (看看)...
【讨论】:
您可能想要使用全局互斥锁。
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 到终端服务器会话(名称以“Local\”为前缀,如果未指定前缀,则为默认值)。
您可以在MSDN: Mutex Class 中找到有关 Mutex 的更多详细信息。
【讨论】:
在全局程序集缓存中安装您的 .net dll。然后它可以被计算机上的任何应用程序引用。
【讨论】: