2016-05-04 14 views
0

私は問題を抱えていましたが、次の原因を原因として特定しました(今まで症状をトラブルシューティングしていました)。基本的には、WPFアプリケーションプロジェクト(スタートアップ)、多数のアセンブリ(Model、ModelViewなど)、Word VSTOアドインを持つソリューションがあります。 ViewModelとWord Add-Inはいずれもモデルの1つを構成します。この段階では、私はSingletonを作成しました。C#シングルトンがMS Word Interopアドインに公開されました

のViewModelは

ModelSingleton mod = ModelSingleton.Instance; 

を使用してアドインがThisAddIn_Startup()メソッドで同じことを行い、そのコンストラクタでモデルをインスタンス化します。

モデルコード:

private static volatile ModelSingleton instance; 
private static object syncRoot = new Object(); 

private ModelSingleton() 
{ 
} 

public static ModelSingleton Instance 
{ 
    get 
    { 
     lock (syncRoot) 
     { 
      if (instance == null) 
      { 
       instance = new ModelSingleton(); 
      } 
     } 
     return instance; 
    } 
} 

私が強調表示されたテキストをキャプチャし、その後のViewModelがに下塗りされていること、独自のイベントを生成し、私のモデルにそれを渡すためにWordのアドインをしたいです。

私の問題は、アドインとビューモデルの両方が、シングルトンであると思われるものの別のインスタンスを作成していることです。強調表示されたテキストは1つのシングルトンに渡されますが、ViewModelが別のインスタンスでイベントを購読しているため、イベントは生成されません。

私はInteropとCOMのnewbです。私は、シングルトンは一度しかインスタンス化されないと期待します。 2つの別々のランタイムまたは何かがここにあります(明らかに、VSTOとWPFは両方ともデータを直接共有できないという実行可能ファイルです)。シングルトンを真のシングルトンにするにはどうすればいいですか?それが不可能な場合、MS Wordのハイライトされたテキスト(およびメタデータ)を独自のアプリケーションにどのように渡すのでしょうか?

答えて

0

私はあなたがこれをやろうとしていると思う:

public static ModelSingleton Instance 
{ 
    private static ModelSingleton instance = null; 
    private static readonly object syncRoot = new Object(); 

    private ModelSingleton() 
    { 
    } 
    get 
    { 
     lock (syncRoot) 
     { 
      if (instance == null) 
      { 
       instance = new ModelSingleton(); 
      } 
     } 
    return instance; 
    } 
} 

これは、それは不明であった場合は、申し訳ありません任意のデッドロック

+1

せずに安全性をスレッド与えるが、包まれた「パブリッククラスModelSingleton { を}」想像されます上のコードの周り – Moe45673

関連する問題