2011-02-06 9 views
1

WCFを使用して作成された "MyService"と呼ばれる簡単なWindowsサービスがあり、起動時に "HKEY_CLASSES_ROOT \ Folder \ Shell \ { ContextMenuEntryName} "という名前のエントリを持つように、ウィンドウ内の任意の場所にある右クリックメニューを許可します。このエントリをクリックすると実行されるターゲットは別のプログラムである。 "{パス} \ serviceclient.exe%1" "%1"は、そのコンテキストメニューが呼び出されたWindowsフォルダのパスを表示します。このプログラムは、その値を受け取り、サービスのプロキシを作成してそのメソッドを呼び出すことで、サービスに渡します。コンテキストメニュー項目を実行している間にWindowsサービスにパラメータを渡す

次のようにそのOnStartメソッドメソッドのためのWindowsサービスコードは次のとおりです。

protected override void OnStart(string[] args) 
    {    
      if (_serviceHost != null) 
      { 
       _serviceHost.Close(); 
      } 

      // Add registry entry for context menu option        System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); 
      string contextMenuCommandPath = 
       Environment.CurrentDirectory.Substring(0, Environment.CurrentDirectory.IndexOf("MyService")) + 
       "serviceclient\\bin\\Debug\\serviceclient.exe %1"; 
      _contextMenu.AddContextMenu(ContextMenuName, contextMenuCommandPath, "Folder"); 
      _contextMenu.AddContextMenu(ContextMenuName, contextMenuCommandPath, "*"); 

      // Create a ServiceHost for the CalculatorService type and 
      // provide the base address. 
      _serviceHost = new ServiceHost(typeof(MyService)); 

      // Open the ServiceHostBase to create listeners and start 
      // listening for messages. 
      _serviceHost.Open();   
    } 

serviceclient.exeがそれに「MYSERVICE」という名前のサービス参照を追加した後、次のコードを持っています

 // Instantiate service proxy 
     var myServiceClient = new MyService.MyServiceClient(); 
     // Execute monitor target based on path specified (or default). 
     myServiceClient .Monitor(args.Length > 0 ? args[0] : string.Empty); 

私は同じことをする別の別のプログラムを呼び出すのではなく、コンテキストメニューの項目をクリックすると、Windowsサービス自体に引数を直接渡したいと考えています。

コンテキストメニュー項目を実行しているときにWCFのWindowsサービスに情報を直接渡すことは可能でしょうか?

+0

@TrueWill:WindowsサービスはWCFサービスをホストできます。これは、オペアンプが使用しているようです。 .exeは彼がWCFサービスを呼び出すことを間違いなく開始する。 –

+0

@ジョン:TrueWillのことを明確にしてくれてありがとう。はい、WCFサービスは、WindowsサービスまたはWebサービスのいずれかです。私は前者を作りました。私はWCFサービスをWindowsサービスにラップしていますが、これは私が処理しようとしているものです。 – Cranialsurge

+0

実際には、WCFサービスは両方とも可能です。 WindowsサービスでHTTPバインディングを使用するWCFサービスをホストできます。 –

答えて

1

一見したようには見えませんが、複雑なテーマです。 Creating Shortcut Menu Handlersを参照してください。

+0

さて、間違いなくちょっとトリッキーです。 Windowsサービスの問題点は、(OnStart()メソッドの)起動時にのみ引数を受け入れることです。 WCFエンドポイントのプロキシを作成してWindowsサービス内にホストプログラムを作成し、そのメソッドを呼び出し、コンテキストメニューで渡された値を渡すクライアントプログラムは、コンテキストメニューのエントリをサービスに送る唯一の方法です。私は、Windowsサービスを自立させ、メッセージの受け渡しのファシリテーター以上の役割を果たすクライアントプログラムに頼る必要がないようにするために、いくつかの方法をお勧めします。 – Cranialsurge

+0

@Cranial:何らかの.exeを起動せずにこれを行う方法はありませんが、リンクされた記事全体を読むと別の方法があります。 –

0

あなたのWindowsサービス内の名前付きパイプのサーバーを実装した場合は多分あなたのようなもので、コンテキストメニューコマンドから直接ファイルパスデータを送信できます。ただし、標準のWCFを使用することはできません

echo %1 > \\.\pipe\{pipe-name} 

そのバインディングに焼き込まれたall the .NET-specific protocol requirementsのためにパイプサーバーを実装するNetNamedPipeBindingは、System.IO.Pipesクラスを使用するか、パイプから生のメッセージを受け取るだけのカスタムWCFトランスポートを作成する必要があります。

関連する問題