2009-05-18 11 views
4

コンソールアプリケーション、WinForms、AspNet、またはWindowsサービスで実行されているかどうかによって、例外に応答する必要のあるライブラリがあります。私はSystem.Windows.FormsとSystem.Web名前空間のさまざまなプロパティを調べてみましたが、私のライブラリをホストしているアプリケーションの種類を正確に検出する信頼できる方法を見つけることはできません。誰も前にここにいたのですか?誰も信頼できる解決策を持っていますか?.Netアプリケーションタイプの検出方法?

+1

私が使用した解決策は、ArulとJoshによって提供された回答と、これらのリンクを組み合わせたものです。http://blogs.msdn.com/kstanton/archive/2004/03/31/105060.aspx、http:// www .codeguru.com/cpp/wp/system/misc/article.php/c2897。だから最初にASPコンテキストがあるかどうかをチェックします。メインのアプリケーションバイナリをロードしてヘッダーにフラグをチェックし、Windowsまたはコンソールサブシステムをターゲットにしているかどうかを確認します。誰かが興味を持っているなら、私はコードサンプルを提供することができます。 –

答えて

3

私はこのルートを下る前にあなたのデザインに疑問を持っていましたが、これは興味深い挑戦だと思っていました。

ASP.Net:HttpContext.Currentがnullでないことを確認してください。また、System.Web.Hosting.ApplicationManager.GetApplicationManager()を見ることができますが、これがAsp.netの外部でどのように動作するかはわかりません。

ウィンドウフォーム:System.Windows.Formsを試してみてください。 Application.OpenForms、これは開いているフォームを返します。 Windowsフォームアプリケーションは決してフォームを持たないという前提があります。また、コンソールアプリケーションもwinフォームを開始することができます。

サービス:これはわかりませんが、プロセスの名前を確認できるかどうかは疑問です。プロセスがサービスであるとき、タスクマネージャを示すことからも

+1

HttpContext.Currentに注意してください。 ASP.NETアプリケーションの非要求スレッド内でnullを返します。 –

2

これはあなたがデザインをもう少し見てみたいと思うように感じます。私の自発的ですが。クラスライブラリは、その呼び出し元についてそのようなことを知る必要はありません。

実行中のコンテキストに基づいて例外処理の動作を変更したいのですが?

あなたのコメントに基づいて、エラーハンドラ用のインターフェイスを定義し、必要な数のインターフェイス(WinForms用、コンソール用など)を作成し、クライアントアプリケーションは、対応する実装を作成してライブラリに挿入します。そうすれば、知識の必要性を図書館から取り除き、責任をクライアントアプリケーションに移すことができます。これらの実装は依然としてクラスライブラリ内に置くことができますが、使用する決定はクライアントアプリケーションが行うものです。

+0

さまざまなコンテキストで使用できる他のライブラリやアプリケーション用のインフラストラクチャを提供するサポートライブラリです。このライブラリは、未処理のエラーを処理し、それらをホストアプリケーションに報告する共通の手段を提供します。 –

+0

いずれの場合も、詳細が記載されたメールがJiraサーバに送信されます。しかし、Windowsではスクリーンショットがキャプチャされ、ユーザにはダイアログが表示されます。コンソールアプリでは、詳細がコンソールに書き込まれます。私はここでエラー処理を述べてきましたが、他の目的もあるかもしれません。 –

+0

あなたのコメントに応じて私の答えを更新しました –

5

あなたが正しく探しているものを理解していれば、エラー処理を行うライブラリが1つありますが、ソースがWeb、コンソール、winformsなどであるかどうかを知りたいでしょうか?

ライブラリ内で、消費するアプリケーションの種類を追跡する列挙型などのプロパティを利用できます。あなたは常にだけでアプリケーションの種類ごとにクラスを持つことができます。また
たとえば...

ErrorLogger error = new ErrorLogger(ErrorLoggerAppType.WinForm); 
ErrorLogger error = new ErrorLogger(ErrorLoggerAppType.Web); 
ErrorLogger error = new ErrorLogger(ErrorLoggerAppType.Console); 

EDIT
サミルからのコメントでは...あなたのエラーロガーライブラリ内の同じインターフェースを実装します。あなたが利用することになるWebアプリケーションにおける例えば

WebErrorLogger error = new WebErrorLogger(); 
+1

または:error = new GUIErrorLogger(); /エラー=新しいWebErrorLogger(); /エラー=新しいConsoleErrorLogger();彼らはすべてErrorLoggerインターフェースを実装しています。 –

+0

これもうまくいくでしょう... – RSolberg

+0

これは私が現時点で務めているところですが、消費者がこのように初期化する必要性を取り除こうとしています。もし誰も良いアイデアを考え出すことができないなら、私はこのことにこだわるべきでしょう。 –

3

これが最良の設定で処理される何かのように聞こえます。おそらく、IOCを介してIExceptionHandlerインターフェイスのようなものを注入します。

1
BOOL IsConsole(PBYTE file) 
{ 
    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)file; 
    if(pDosHeader->e_magic == IMAGE_DOS_SIGNATURE) 
    { 
     PIMAGE_NT_HEADERS pImageHeaders = (PIMAGE_NT_HEADERS)(file + pDosHeader->e_lfanew); 
     if(pImageHeaders->Signature == IMAGE_NT_SIGNATURE) 
     { 
      IMAGE_OPTIONAL_HEADER optionalHeader = pImageHeaders->OptionalHeader; 
      return (optionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI); 
     } 
    } 

    return FALSE; 
} 

IMAGE_SUBSYSTEM_WINDOWS_CUIが、それは代わりに、コンソールのGUIアプリケーションのかどうかを検出するためにIMAGE_SUBSYSTEM_WINDOWS_GUIでexcahngedすることができます(少なくとも、Vistaではそれがない)は、Windows APIが存在する必要があります。

Windowsのサービスでは通常、親として 'services.exe'があります。親プロセスを判断する方法は、CodeProjectで詳しく説明しています。

ASP.NETプロセスは、ASPNETという特別なユーザーの下で実行され、ユーザーの名前はan access tokenから取得できます。

+0

これは私が達成しようとしているものに最も近いものです。このリンクはバイナリがコンソールアプリケーションであるかどうかについて合理的な量の情報を提供しているようです:http://www.codeguru.com/cpp/w-p/system/misc/article.php/c2897。私は使用されているASPNETユーザーに頼ることはできません - 私たちはさまざまな目的のためにすべての種類のサービスアカウントを使用して実行します。私は以下のジョシュの答えと一緒に、おそらく答えに合理的なスタブを思いつくことができると思います。 –

関連する問題