DLL中的Singleton类可以跨进程共享吗?

我正在创建一个自定义.net硬件框架,其他程序员将使用它来控制某些硬件。 他们将添加对我们的DLL的引用以进入我们的硬件框架。 我需要一个可以从多个应用程序(进程)访问的共享类。

单例模式似乎是我需要的,但它只适用于进程内的多个线程。 我可能完全错了,但这里是我目前拥有的C#代码的一个例子。 我不禁觉得设计不正确。 我希望我可以分享更具体的信息,但我不能。

  • 我必须强调,我无法控制客户应用程序。 解决方案必须包含在框架(DLL)本身内。

框架:(共享DLL)

public class Resources { static readonly Resources m_instance = new Resources(); public string Data; private Resources() { Data = DateTime.Now.ToString(); } public static Resources Instance { get { return m_instance; } } } 

测试应用程序:(最终客户应用程序)

 class Program { static void Main(string[] args) { Console.WriteLine("Press enter to capture the resource!"); Console.ReadLine(); var resources = Resources.Instance; Console.WriteLine("\r\n{0}: {1}\r\n", Thread.CurrentThread.ManagedThreadId, resources.Data); BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += WorkerDoWork; worker.RunWorkerAsync(); while (worker.IsBusy) { Thread.Sleep(100); } Console.WriteLine("Press enter to close the process!"); Console.ReadLine(); } static void WorkerDoWork(object sender, DoWorkEventArgs e) { var resources = Resources.Instance; Console.WriteLine("\r\n{0}: {1}\r\n", Thread.CurrentThread.ManagedThreadId, resources.Data); } } 

第一个启动的应用程序输出:

按Enter键捕获资源!

1:6/24/2009 8:27:34 AM

3:6/24/2009 8:27:34 AM

按Enter键关闭进程!

第二个应用程序输出:

按Enter键捕获资源!

9:6/24/2009 8:27:35 AM

10:6/24/2009 8:27:35 AM

按Enter键关闭进程!

结论

我想看到两个应用程序返回类的第一个实例化时间的相同字符串。

正如您所看到的,单例适用于进程内的multithreading,但不适用于跨进程。 也许这不能做,因为我似乎无法找到任何解决方案。

您不能使用单例来跨应用程序进行同步。 每个都在自己的应用程序空间中运行,并且作为安全问题无法访问内存/对象/等。 来自另一个没有通信方法(如远程处理)要同步这两个,他们必须远程进入第三个程序。

是的,可以在多个流程中共享单例。 但是,您需要利用支持进程间通信的技术来实现此结果。

允许您直接分享对象的最流行的技术是Remoting和WCF。

举一个与这些中的任何一个共享单身的例子超出了SO答案的范围。 但是网络上有很多关于这些教程的教程。 谷歌搜索技术加单身应该会让你走上正确的道路。

要添加到Kevin的答案中,您的类Resources的构造函数应该被设置为私有,因为它是一个真正的单例,否则没有什么能阻止某人通过构造函数创建Resources类的新实例。 这并没有解决你的问题,但它确实阻止了一个人滥用Singleton。

只需从两个不同的进程中调用不同程序集中的单例属性,就会创建该类的不同实例。

但是,如果您只需要简单的信令( EventWaitHandle ),则可以使用.Net Remoting轻松地在进程之间共享信息,或者触发进程间事件。

[编辑:]为了使它看起来像调用者的Singleton,你可以公开一个类,它将在内部使用Remoting实例化一个单例,然后透明地返回实例。 这是(我认为)这样做的一个例子: http : //www.codeproject.com/KB/dotnet/remotingsingleton.aspx

如上所述,有办法做到这一点。 但是如果你使用WCF或远程处理它是笨拙的。 请尝试进程间线程同步技术。

欲了解更多信息,请阅读有关线程的在线免费电子书

http://www.albahari.com/threading/

特别是在这里看到跨进程同步结构……

http://www.albahari.com/threading/part2.aspx#_Synchronization_Essentials