2009-06-24 81 views
11

我正在創建一個將被其他程序員用來控制某些硬件的自定義.net硬件框架。他們會添加一個對我們的DLL的引用,以達到我們的硬件框架。我需要一個可以從多個應用程序(進程)訪問的共享類。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上午8時27分34秒

3:2009/6/24上午8時27分34秒

按回車鍵關閉該進程!

第二個應用程序提供的輸出:

按回車鍵奪取資源!

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

10:2009/6/24上午08點27分35秒

按回車鍵關閉該進程!

結論

我想看到這兩個應用程序返回的類的實例第一次的時間相同的字符串。

正如你所看到的單身人士在進程內的多線程工作,但不是跨進程。也許這不能完成,因爲我似乎無法找到任何解決方案。

+0

我必須強調,我會無法控制客戶應用程序。解決方案必須包含在框架(DLL)本身內。 – 2009-06-24 17:09:14

回答

2

您不能使用單例來跨應用程序同步。每個應用程序都在自己的應用程序空間中運行,並且由於安全性無法訪問內存/對象/等。從另一個沒有溝通的方法(如遠程)要同步他們將不得不遠程到第三個程序。

+0

我有同樣的問題,但作爲替代方案,我是否可以將此單例實例放置在GAC中,並且這兩個過程都可以引用該實例?那樣的話,如果我從一個進程更新對象,那麼另一個進程會不會得到更新的實例? OR是否每個進程都在自己的進程中加載​​實例? – hangar18 2012-02-13 15:37:29

+0

@ hangar18這是完全相同的問題 - 把它放在GAC中沒有什麼特別的,它仍然是一個DLL! – markmnl 2013-10-25 04:30:39

7

是的,可以在多個進程中共享一個單例。但是,您需要利用支持進程間通信的技術來實現此結果。

最流行的技術,讓你直接分享你的對象是Remoting和WCF。

給出一個共享一個單例的例子超出了這個答案的範圍。但是網絡上有很多關於這些教程的教程。谷歌搜索技術加單身應該把你放在正確的道路上。

2

要添加到凱文的答案,您的類的構造函數資源應真正被私有它是一個真正的單身人士,否則沒有任何東西阻止某人通過構造函數創建一個新的資源類實例。這並不能解決你的問題,但它確實可以防止濫用Singleton。

1

只需在來自兩個不同進程的不同程序集中調用單一屬性將創建該類的不同實例。

但是,如果您只需要簡單的信號發送(EventWaitHandle),則可以使用.Net Remoting輕鬆共享進程之間的信息,或發生進程間事件。

[編輯:]爲了讓它看起來像你的調用者的單例,你可以公開一個內部使用Remoting實例化一個單例的類,然後透明地返回實例。這裏是一個例子(我認爲)這樣做:http://www.codeproject.com/KB/dotnet/remotingsingleton.aspx