.Net DLLでWindowsGUIアプリケーションとWebサービスのどちらで実行されているかを確認するにはどうすればよいですか?2つのアプリケーション間で共有されている低レベルのクラスがあり、Webサービスで使用するときにメッセージボックスを無効にする必要があります。
Windowsアプリケーションには200を超えるソリューションがあり、私は既存のコードをリファクタリングする立場にありません。Webサービスはいくつかの機能を再利用する必要があり、私は迅速な修正を探しています。
.Net DLLでWindowsGUIアプリケーションとWebサービスのどちらで実行されているかを確認するにはどうすればよいですか?2つのアプリケーション間で共有されている低レベルのクラスがあり、Webサービスで使用するときにメッセージボックスを無効にする必要があります。
Windowsアプリケーションには200を超えるソリューションがあり、私は既存のコードをリファクタリングする立場にありません。Webサービスはいくつかの機能を再利用する必要があり、私は迅速な修正を探しています。
一般的なアドバイスの一部として、低レベルのクラスはおそらくメッセージボックス自体を使用するべきではありませんが、中間(インターフェイスに近い)クラスがメッセージボックスが必要になる可能性のあるケースを処理できるようにする必要があります。
これを行う場合は、デスクトップとは異なる高レベルのクラスをWebに使用するだけで、それぞれにコンテキストに適した通知機能があります。
Webコンテキストで実行されている場合、HttpContext.Currentはnullにはなりません。
Environment.UserInteractiveプロパティを使用できます。
UserInteractive プロパティは、Windows プロセス、またはユーザー インターフェイスなしで実行される IIS などのサービスに対して false を報告します。このプロパティが false の場合、モーダル ダイアログまたはメッセージ ボックスを表示しないでください。ユーザーが対話するためのグラフィカル ユーザー インターフェイスがないためです。
あなたがこれを行うことができないことはわかっていますが.... アプリケーションの設計についても考えたいと思うかもしれません。
これがうまくいくかどうかはわかりませんが、うまくいくかもしれません。次の Win32 呼び出しを使用します。
GetModuleFileNameEx を使用して dll の exe を取得し、後で比較できるように保存します。
EnumWindows を使用して、すべての最上位ウィンドウを取得します。
GetWindowModuleFileName を使用して、ウィンドウ ハンドルを EnumWindows からモジュール名に変換します。
GetWindowModuleFileName の結果の中に独自の exe が見つかった場合、その dll は GUI アプリで実行されています。