Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重定向stdout+;C#Windows服务上的stderr_C#_.net_Windows Services_Stdout_Stderr - Fatal编程技术网

重定向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
}