ServiceBase
ヘルパーを使用してC#でWindowsサービスを作成しました。実行中に、外部ネイティブDLL上のいくつかのプロシージャが呼び出されます。注意深く、これらのプロシージャは、このDLLに対してソースが与えられていないので、制御されない方法でstdoutおよび/またはstderrに書き込みます。C#Windowsサービスでstdout + stderrをリダイレクト
これらの出力をC#サービスからログファイルにリダイレクトすることはできますか?
ServiceBase
ヘルパーを使用してC#でWindowsサービスを作成しました。実行中に、外部ネイティブDLL上のいくつかのプロシージャが呼び出されます。注意深く、これらのプロシージャは、このDLLに対してソースが与えられていないので、制御されない方法でstdoutおよび/またはstderrに書き込みます。C#Windowsサービスでstdout + stderrをリダイレクト
これらの出力をC#サービスからログファイルにリダイレクトすることはできますか?
あなたは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
}
はConsole.SetOut方法をチェックしてください。
コンソール出力をTextWriterにリダイレクトすることができます。
DLLの書き方によっては、DLL出力をコンソールにリダイレクトしません。通常は動作しますが、必ずしもそうではありません。 –
リード、それは何に依存しているのですか? – Stiefel
プロセスとしてDLLを起動していますか?または単にDLLを参照していますか? –
プロセスとしてDLLを開始することはできません。これはよくある問題です。 –