重定向stdout+;C#Windows服务上的stderr
我使用重定向stdout+;C#Windows服务上的stderr,c#,.net,windows-services,stdout,stderr,C#,.net,Windows Services,Stdout,Stderr,我使用ServiceBasehelper用C#编写了一个Windows服务。在执行过程中,调用外部本机DLL中的某些过程。令人烦恼的是,这些过程以不受控制的方式写入标准输出和/或标准输出,因为没有为这个DLL提供源 是否可以将这些输出从C#服务重定向到日志文件?您可以通过PInvoke将这些输出重定向到: 看看这个方法 它将允许您将控制台输出重定向到TextWriter。是否作为进程启动DLL?或者只是引用DLL?不能将DLL作为进程启动。这是一个常见的问题。不过,根据DLL的编写方式,这不会将
ServiceBase
helper用C#编写了一个Windows服务。在执行过程中,调用外部本机DLL中的某些过程。令人烦恼的是,这些过程以不受控制的方式写入标准输出和/或标准输出,因为没有为这个DLL提供源
是否可以将这些输出从C#服务重定向到日志文件?您可以通过PInvoke将这些输出重定向到: 看看这个方法
它将允许您将控制台输出重定向到TextWriter。是否作为进程启动DLL?或者只是引用DLL?不能将DLL作为进程启动。这是一个常见的问题。不过,根据DLL的编写方式,这不会将DLL输出重定向到控制台。通常,它可以工作,但并不总是.Reed,那么它依赖于什么呢?我更改了行handle=filestream.Handler;by handle=filestream.SafeFileHandle.DangerousGetHandle();因为filestream.Handler已弃用。有没有办法在没有filestream的情况下使用它?(即MemoryStream或类似内容)?@ReedCopsey-请参阅我对我的新问题的类似评论的回复:@Herchu您是否意识到危险手柄中的“危险”?这是有原因的:@ruimarkes是的,他们叫我危险是有原因的!:)现在认真对待;那是2009年。如果我碰巧再次需要它,我会按照史蒂夫的解决方案来写。
[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
}