可一个Singleton类一个DLL内跨进程共享的?(Can a Singleton Class i

2019-06-24 01:54发布

我创建一个自定义的.NET架构的硬件将被其他程序员用来控制一些硬件。 他们将一个引用添加到我们的DLL去我们的硬件架构。 我需要将来自多个应用程序(进程)访问的共享类的。

Singleton模式似乎是我所需要的,但它仅适用于您的进程内的多个线程。 我可能是完全错误的,但这里是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);
    }
}

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

按回车键夺取资源!

1:2009/6/24上午08时27分34秒

3:2009/6/24上午08时27分34秒

按回车键关闭该进程!

所述第二应用程序提供的输出:

按回车键夺取资源!

9:2009/6/24上午08点27分35秒

10:2009/6/24上午8点27分35秒

按回车键关闭该进程!

结论

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

正如你所看到的进程中多线程的单身作品但是不交处理。 也许这不能做,因为我似乎无法找到任何解决方案。

Answer 1:

您不能使用一个单跨应用程序同步。 在其各自的应用空间中运行,并作为安全的问题不能访问内存/对象/等。 从其他没有通信(如远程)的方法,要同步两个他们将不得不远程到第三程序。



Answer 2:

是的,它是可以共享一个单独当中几个过程。 然而,你将需要采取的支持,以实现这一结果的进程间通信的技术优势。

最流行的技术,让你可以分享你的对象相当直接的远程处理和WCF。

给人以任一共用一个单身的例子是超出SO答复的范围。 但也有网站对于这些很多教程。 无论是谷歌搜索技术加上单身应该把你在正确的道路上。



Answer 3:

要添加到凯文的回答,你为你的资源类的构造函数应该真正为私有它是一个真正的单身人士,否则没有什么是停止从通过构造函数创建资源类的新实例的人。 这不会解决你的问题,但它确实阻止一个人滥用辛格尔顿。



Answer 4:

简单地调用来自两个不同的进程在不同的装配单身属性将创建一个类的不同实例。

但是,你可以轻松地共享使用的.Net进程之间的远程处理 ,或火灾事件间,如果你只需要简单的信号( 的EventWaitHandle )。

[编辑:],使它看起来像一个单身到您的呼叫,您可以公开一类将在内部使用Remoting的实例化一个单,然后返回透明的实例。 下面是一个例子(我认为)这是否: http://www.codeproject.com/KB/dotnet/remotingsingleton.aspx



Answer 5:

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

欲了解更多信息读取线程的在线免费电子书

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

特别看到跨进程同步构建这里...

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



文章来源: Can a Singleton Class inside a DLL be shared across processes?