マネージ コードで記述しているメソッドが対話型アプリから呼び出されているか、Windows サービスから呼び出されているかを確認するにはどうすればよいですか?
5 に答える
私はこれを理解したかもしれないと思います(少なくともこれは私のニーズに合っています-あなたのマイレージはあなたがやろうとしていることによって異なるかもしれません)。「UserInteractive」と呼ばれる環境オブジェクトからぶら下がっているプロパティがあります。デスクトップにアクセスできるコンテキストで実行しているかどうかがわかります。
Windows サービスのどの部分について知りたいですか? または、インタラクティブなアプリのどの部分について知りたくないですか? あなたにとって実際に重要なことは何ですか?
このようなご要望をよく耳にしますが、それは設計ミスがほとんどです。私はいくつかの答えを提案します:
- 呼び出し元に使用するフォーマッターを指示させるか、または
- フォーマッタ クラスの名前を構成ファイルに配置します。すべてのフォーマッターが同じインターフェースを実装するようにします。実行時に初めてフォーマッタが必要になった場合は、構成ファイルで指定されたもののインスタンスを作成し、共通インターフェイスを介して呼び出します。
- 車輪を再発明しないでください。System.Diagnostics のクラスを使用します。実際、このクラスは私の #2 と同じように構成されます。
コードが呼び出されたコンテキストに敏感であることは、ほとんどの場合間違いです。
これを行うには、少なくとも 2 つの方法があります。
- 「System.Reflection.Assembly.GetCallingAssembly().FullName」は、コードを呼び出しているアセンブリの名前を返します。
- "Environment.StackTrace" は、誰がコードを呼び出しているかの完全なスタック トレースを返します。文字列に呼び出しメソッド名が表示されます。
対話型アプリ用と Windows サービス用の 2 つの異なるロガーを定義できます。クライアントは、構成ファイルを使用して使用するロガーを選択できます。クライアントが間違ったロガーを選択したり、構成を忘れたりした場合は、デフォルトのロガーを使用することもできます。ログの記録やメッセージの書式設定などの機能を構成可能にすることをお勧めします。
組み込みの可能性があるかどうかはわかりませんが、System.Diagnostics.Process
クラスを見てください。とりわけ、GetService()
メソッドがあり、おそらくそれが役立つでしょう。それが失敗した場合StartInfo
、役立つ情報が含まれている可能性のあるメンバーが存在します。
PInvoke を使用してもかまわない場合は、現在のプロセスの親プロセスを取得できます。アカウントNT AUTHORITY\SYSTEMで実行されていて、その名前がservice.exeである場合、現在のプロセスは (おそらく) サービスです。