27

コンソール アプリケーションとサービスの両方として実行できる C#/.NET プログラムがあります。現在、コンソール アプリケーションとして起動するコマンド ライン オプションを提供していますが、それは避けたいと考えています。

プログラムがサービスとして開始されているかどうかをプログラムで検出することはできますか?

純粋な Win32 の場合は、StartServiceCtrlDispatcher を使用してサービスとして開始し、ERROR_FAILED_SERVICE_CONTROLLER_CONNECT が返された場合はコンソールにフォールバックできますが、System.ServiceProcess.ServiceBase.Run() が失敗するとエラー ダイアログが表示され、エラーを通知せずに返されます。プログラムに。

何か案は?

4

8 に答える 8

33

Environment.UserInteractiveは魔法を行います。

于 2010-02-18T10:39:31.080 に答える
7

ラスムスさん、 先ほどの質問です。

回答から、最も一般的な方法は、単純なコマンド ライン オプションを使用するか、try catch ブロックでコンソール オブジェクトにアクセスすることです (サービスでは、コンソールはプロセスに接続されておらず、それにアクセスしようとすると例外がスローされます)。 .

または、サービスのテスト/デバッグに問題がある場合は、コードを別の dll アセンブリに移動し、別のテスト ハーネス (winforms/console など) を作成します。

(ジョナサンが質問の最後に彼の解決策を追加したことに気付きました。)

于 2008-10-16T09:47:19.340 に答える
3

親プロセスの検索に関するこの回答の ParentProcessUtilities 構造体を使用すると、次のことができます。

static bool RunningAsService() {
    var p = ParentProcessUtilities.GetParentProcess();
    return ( p != null && p.ProcessName == "services" );
}

親プロセスのプロセス名には拡張子「.exe」が含まれないことに注意してください。

于 2013-04-26T13:19:37.907 に答える
3

試したことはありませんが、Process.GetCurrentProcessが役立つ可能性があります.コンソールモードでは、プロセス名は実行可能ファイルと同じですが、サービスとして実行する場合は期待します(もう一度確認してください!)それは違うでしょう。

于 2008-10-16T09:26:37.697 に答える
3
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
const int STD_OUTPUT_HANDLE = -11;

IntPtr iStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

if (iStdOut == IntPtr.Zero)

{    
    app.RunAsWindowsService = true;

}

// Run as Service
if (runAsWindowsService)                                
{
     // .....
     ServiceBase.Run(myService);
}
else 
{
    // Run as Console
    // Register Ctrl+C Handler...
}
于 2011-06-01T14:40:27.537 に答える
1

これが機能するかどうかはわかりませんが、このコードでPInvokeを使用して、親が「services.exe」であるかどうかを確認することをお勧めします。

于 2010-02-18T11:09:31.130 に答える
0

Console.IsErrorRedirectedをチェックすることで、コンソールアプリケーションにいるかどうかを検出することになりました。コンソール アプリの場合は "false" を返し、テストした非コンソール アプリの場合は "true" を返しました。IsOutputRedirectedも使用できました。

これらが正確ではない状況があると思いますが、これは私にとってはうまくいきました.

于 2013-07-31T23:48:23.500 に答える