2009-10-16 14 views
12

ServiceBaseヘルパーを使用してC#でWindowsサービスを作成しました。実行中に、外部ネイティブDLL上のいくつかのプロシージャが呼び出されます。注意深く、これらのプロシージャは、このDLLに対してソースが与えられていないので、制御されない方法でstdoutおよび/またはstderrに書き込みます。C#Windowsサービスでstdout + stderrをリダイレクト

これらの出力をC#サービスからログファイルにリダイレクトすることはできますか?

+0

プロセスとしてDLLを起動していますか?または単にDLLを参照していますか? –

+0

プロセスとしてDLLを開始することはできません。これはよくある問題です。 –

答えて

22

あなたはSetStdHandleにのPInvoke経由でこれを行うことができます。

[DllImport("Kernel32.dll", SetLastError = true) ] 
public static extern int SetStdHandle(int device, IntPtr handle); 

// in your service, dispose on shutdown.. 
FileStream filestream; 
StreamWriter streamwriter; 

void Redirect() 
{ 
    int status; 
    IntPtr handle; 
    filestream = new FileStream("logfile.txt", FileMode.Create); 
    streamwriter = new StreamWriter(filestream); 
    streamwriter.AutoFlush = true; 
    Console.SetOut(streamwriter); 
    Console.SetError(streamwriter); 

    handle = filestream.Handle; 
    status = SetStdHandle(-11, handle); // set stdout 
    // Check status as needed 
    status = SetStdHandle(-12, handle); // set stderr 
    // Check status as needed 
} 
+0

ありがとうございます。私はこれをやります。 – Herchu

+1

私は行を変更しました handle = filestream.Handler; by handle = filestream.SafeFileHandle.DangerousGetHandle(); filestream.Handlerは推奨されないため、 – Herchu

+1

これをFileStreamなしで使用する方法はありますか? (つまりMemoryStreamなど)? – Steve

0

Console.SetOut方法をチェックしてください。

コンソール出力をTextWriterにリダイレクトすることができます。

+1

DLLの書き方によっては、DLL出力をコンソールにリダイレクトしません。通常は動作しますが、必ずしもそうではありません。 –

+1

リード、それは何に依存しているのですか? – Stiefel

関連する問題