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

Bob*_*non 12 c# dll singleton frameworks shared-libraries

我正在创建一个自定义.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;
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

按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键关闭进程!

结论:

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

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

Jar*_*Par 7

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

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

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


kem*_*002 5

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