2009-06-24 42 views
11

私は他のプログラマーがハードウェアを制御するために使用する.netハードウェアフレームワークを作成しています。彼らは私たちのハードウェアフレームワークに到達するためにDLLへの参照を追加します。私は複数のアプリケーション(プロセス)からアクセスされる共有クラスが必要です。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; 
     } 
    } 
} 

テストアプリケーション:

:(最終的には顧客APP)

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:2009年6月24日8時27分34秒AM

3:2009年6月24日8時27分34秒AM

を押して、プロセスを閉じるように入力してください!

押して、リソースをキャプチャするために入力します。

第二のアプリケーションは、の出力を提供します!

9:2009年6月24日8時27分35秒AM

10:2009年6月24日8時27分35秒AM

を押して、プロセスを閉じるように入力してください!

結論

私は両方のアプリケーションが、クラスの最初のインスタンス化の時の同じ文字列を返してほしいです。

シングルトンはプロセス内の複数のスレッドで動作しますが、プロセス間では動作しません。たぶん、これはできません私は任意の解決策を見つけるように見えることはできません。

+0

私は私がすることを強調しなければならない...

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

は特別にクロスプロセスの同期はこちらを構築ご覧スレッド上でオンライン無料電子ブックを読みます顧客アプリケーションを制御できません。ソリューションは、フレームワーク(DLL)自体の内部に格納されている必要があります。 –

答えて

2

アプリケーション間でシングルトンを使用して同期することはできません。それぞれは独自のアプリケーション空間で動作し、セキュリティの問題はメモリ/オブジェクト/ etcにはアクセスできません。 (リモーティングのような)コミュニケーションの手段を持たないものから、もう一方のものから、2人を同期させるには、3人目のプログラムに遠ざけなければなりません。

+0

私は同じ質問をしましたが、代わりに、このシングルトンインスタンスをGACに配置することはできません。両方のプロセスがそのインスタンスを参照できますか?そうすれば、あるプロセスからオブジェクトを更新しても、他のプロセスが更新されたインスタンスを取得することはありませんか?または、各プロセスは、独自のプロセスでインスタンスをロードしますか? – hangar18

+0

@ hangar18これはまったく同じ質問です.GACに置くことは何も特別なことではなく、依然としてdllです! – markmnl

7

はい、いくつかのプロセス間でシングルトンを共有することは可能です。ただし、この結果を得るためには、プロセス間通信をサポートするテクノロジを活用する必要があります。

オブジェクトを公正に直接共有できる最も一般的なテクノロジは、RemotingとWCFです。

シングルトンをこれらのいずれかと共有する例は、SOの回答の範囲を超えています。しかし、これらのそれぞれについてウェブ上に多くのチュートリアルがあります。技術とシングルトンのどちらかをグーグルで探すことは、あなたを正しい道に導くはずです。

2

クラスのリソースのコンストラクタを本当にシングルトンにするためにプライベートにする必要があります。そうしないと、誰かがコンストラクタを通じてResourcesクラスの新しいインスタンスを作成することを止められません。これはあなたの問題を解決するものではありませんが、シングルトンを誤用するのを止めます。

+0

コンストラクタがプライベートであることは間違いありません。サンプルを修正しました。 –

+0

これはほんの一例です。私は日付を共有しようとしていない。ハードウェアリソースを制御しようとしています。 –

+0

この場合のファイルは問題ありません。私の間違い。 – AlbertoPL

1

2つの異なるプロセスから異なるアセンブリのシングルトンプロパティを呼び出すだけで、そのクラスの異なるインスタンスが作成されます。

しかし、単純なシグナリング(EventWaitHandle)だけが必要な場合は、.Net Remotingを使用してプロセス間で情報を簡単に共有したり、プロセス間イベントを起動したりすることができます。

[編集:]それはあなたの発信者にシングルトンのように見えるようにするには、あなたが内部的にシングルトンのインスタンス化にRemotingを使用するクラスを公開して、透過的にインスタンスを返すことができます。ここには私がそうする例があります:http://www.codeproject.com/KB/dotnet/remotingsingleton.aspx

関連する問題