Tra*_*vis 7 c# dll process redirectstandardoutput
上周我发布了这个问题:如何在C#dll 中将其作为一个进程运行时获取控制台应用程序输出,因为我试图找出问题的原因.但是,我一直无法找到我收到错误的原因,所以我想我会要求跟进直接解决我遇到的问题.
我正在研究DLL中的方法,我必须在其中启动一个进程.用于执行此操作的代码是:
ProcessStartInfo psi = new ProcessStartInfo();
psi.UseShellExecute = false;
psi.ErrorDialog = false;
psi.RedirectStandardError = true;
psi.RedirectStandardOutput = true;
psi.RedirectStandardInput = true;
psi.CreateNoWindow = true;
psi.FileName = @"C:\Program Files\OpenMS-1.6\XTandemAdapter.exe";
psi.Arguments = @"-ini C:\XTandemAdapter.ini";
Process getIDs = new Process();
getIDs.StartInfo = psi;
getIDs.Start();
StreamWriter inputWriter = getIDs.StandardInput;
StreamReader outputReader = getIDs.StandardOutput;
StreamReader errorReader = getIDs.StandardError;
getIDs.WaitForExit();
System.Diagnostics.EventLog.WriteEntry("FMANWiff", "ID output: " + outputReader.ReadToEnd());
System.Diagnostics.EventLog.WriteEntry("FMANWiff", "ID error: " + errorReader.ReadToEnd());
Run Code Online (Sandbox Code Playgroud)
应用程序XTandemAdapter.exe通常作为控制台应用程序运行,FileName和Arguments用于重现此格式:XtandemAdapter.exe -ini XTandemAdapter.ini
我有一个控制台测试应用程序,在这个DLL中调用我的方法.当我使用它时,我能够看到standoutput重定向的结果,我可以看到进程成功执行(被调用的可执行文件也生成一个XML文件作为输出,我可以看到这是创建的).但是,正常的操作模式有一个应用程序调用DLL中的方法,而这最终会调用我的方法.当我以这种方式运行时,我可以看到该进程是通过查看任务管理器创建的,但它很快就会退出,并且没有输出到事件日志,并且没有输出文件由运行的可执行文件创建.
有谁知道为什么它会在一个案例中正常运行但在另一个案例中却不能运行 通过控制台应用程序调用而不是通过dll中的方法调用时,某些操作会有所不同吗?
编辑:我注意到该过程返回的Exitcode是Exitcode:-529697949所以我猜这个过程中出了问题.我将看一下xtandemadapter的代码,并试着找出它的来源.当我从控制台应用程序运行它时,它返回0.
编辑:当我添加调试器中断语句时,我最终逐步执行该方法并观察过程对象的值,无论是在使用控制台测试应用程序还是使用现实世界时.我发现了差异,但我不知道该怎么做.
工作控制台测试应用:
- getIDs {System.Diagnostics.Process (XTandemAdapter)} System.Diagnostics.Process
+ base {System.Diagnostics.Process (XTandemAdapter)} System.ComponentModel.Component {System.Diagnostics.Process}
BasePriority 8 int
EnableRaisingEvents false bool
ExitCode 9 int
+ ExitTime {10/4/2011 1:21:33 AM} System.DateTime
+ Handle 1036 System.IntPtr
HandleCount 53 int
HasExited true bool
Id 2732 int
MachineName "." string
+ MainModule 'getIDs.MainModule' threw an exception of type 'System.ComponentModel.Win32Exception' System.Diagnostics.ProcessModule {System.ComponentModel.Win32Exception}
+ MainWindowHandle 0 System.IntPtr
MainWindowTitle "" string
+ MaxWorkingSet 'getIDs.MaxWorkingSet' threw an exception of type 'System.InvalidOperationException' System.IntPtr {System.InvalidOperationException}
+ MinWorkingSet 'getIDs.MinWorkingSet' threw an exception of type 'System.InvalidOperationException' System.IntPtr {System.InvalidOperationException}
+ Modules 'getIDs.Modules' threw an exception of type 'System.ComponentModel.Win32Exception' System.Diagnostics.ProcessModuleCollection {System.ComponentModel.Win32Exception}
NonpagedSystemMemorySize 3240 int
NonpagedSystemMemorySize64 3240 long
PagedMemorySize 3010560 int
PagedMemorySize64 3010560 long
PagedSystemMemorySize 120196 int
PagedSystemMemorySize64 120196 long
PeakPagedMemorySize 3010560 int
PeakPagedMemorySize64 3010560 long
PeakVirtualMemorySize 137424896 int
PeakVirtualMemorySize64 137424896 long
PeakWorkingSet 9064448 int
PeakWorkingSet64 9064448 long
+ PriorityBoostEnabled 'getIDs.PriorityBoostEnabled' threw an exception of type 'System.InvalidOperationException' bool {System.InvalidOperationException}
+ PriorityClass 'getIDs.PriorityClass' threw an exception of type 'System.InvalidOperationException' System.Diagnostics.ProcessPriorityClass {System.InvalidOperationException}
PrivateMemorySize 3010560 int
PrivateMemorySize64 3010560 long
+ PrivilegedProcessorTime {00:00:00.0937500} System.TimeSpan
ProcessName "XTandemAdapter" string
+ ProcessorAffinity 'getIDs.ProcessorAffinity' threw an exception of type 'System.InvalidOperationException' System.IntPtr {System.InvalidOperationException}
Responding true bool
SessionId 0 int
+ StandardError {System.IO.StreamReader} System.IO.StreamReader
+ StandardInput {System.IO.StreamWriter} System.IO.StreamWriter
+ StandardOutput {System.IO.StreamReader} System.IO.StreamReader
+ StartInfo {System.Diagnostics.ProcessStartInfo} System.Diagnostics.ProcessStartInfo
+ StartTime {10/4/2011 1:21:32 AM} System.DateTime
SynchronizingObject null System.ComponentModel.ISynchronizeInvoke
+ Threads {System.Diagnostics.ProcessThreadCollection} System.Diagnostics.ProcessThreadCollection
+ TotalProcessorTime {00:00:00.8125000} System.TimeSpan
+ UserProcessorTime {00:00:00.7187500} System.TimeSpan
VirtualMemorySize 132001792 int
VirtualMemorySize64 132001792 long
WorkingSet 9064448 int
WorkingSet64 9064448 long
+ Static members
+ Non-Public members
Run Code Online (Sandbox Code Playgroud)
当我按照预期调用dll时,以及何时不起作用:
- getIDs {System.Diagnostics.Process} System.Diagnostics.Process
+ base {System.Diagnostics.Process} System.ComponentModel.Component {System.Diagnostics.Process}
+ BasePriority 'getIDs.BasePriority' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException}
EnableRaisingEvents false bool
ExitCode -529697949 int
+ ExitTime {10/4/2011 1:03:09 AM} System.DateTime
+ Handle 4176 System.IntPtr
+ HandleCount 'getIDs.HandleCount' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException}
HasExited true bool
Id 596 int
MachineName "." string
- MainModule 'getIDs.MainModule' threw an exception of type 'System.ComponentModel.Win32Exception' System.Diagnostics.ProcessModule {System.ComponentModel.Win32Exception}
+ base {"Access is denied"} System.Runtime.InteropServices.ExternalException {System.ComponentModel.Win32Exception}
NativeErrorCode 5 int
+ Non-Public members
- MainWindowHandle 'getIDs.MainWindowHandle' threw an exception of type 'System.InvalidOperationException' System.IntPtr {System.InvalidOperationException}
+ base {"Process has exited, so the requested information is not available."} System.SystemException {System.InvalidOperationException}
+ MainWindowTitle 'getIDs.MainWindowTitle' threw an exception of type 'System.InvalidOperationException' string {System.InvalidOperationException}
+ MaxWorkingSet 'getIDs.MaxWorkingSet' threw an exception of type 'System.InvalidOperationException' System.IntPtr {System.InvalidOperationException}
+ MinWorkingSet 'getIDs.MinWorkingSet' threw an exception of type 'System.InvalidOperationException' System.IntPtr {System.InvalidOperationException}
+ Modules 'getIDs.Modules' threw an exception of type 'System.ComponentModel.Win32Exception' System.Diagnostics.ProcessModuleCollection {System.ComponentModel.Win32Exception}
+ NonpagedSystemMemorySize 'getIDs.NonpagedSystemMemorySize' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException}
+ NonpagedSystemMemorySize64 'getIDs.NonpagedSystemMemorySize64' threw an exception of type 'System.InvalidOperationException' long {System.InvalidOperationException}
+ PagedMemorySize 'getIDs.PagedMemorySize' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException}
+ PagedMemorySize64 'getIDs.PagedMemorySize64' threw an exception of type 'System.InvalidOperationException' long {System.InvalidOperationException}
+ PagedSystemMemorySize 'getIDs.PagedSystemMemorySize' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException}
+ PagedSystemMemorySize64 'getIDs.PagedSystemMemorySize64' threw an exception of type 'System.InvalidOperationException' long {System.InvalidOperationException}
+ PeakPagedMemorySize 'getIDs.PeakPagedMemorySize' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException}
+ PeakPagedMemorySize64 'getIDs.PeakPagedMemorySize64' threw an exception of type 'System.InvalidOperationException' long {System.InvalidOperationException}
+ PeakVirtualMemorySize 'getIDs.PeakVirtualMemorySize' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException}
+ PeakVirtualMemorySize64 'getIDs.PeakVirtualMemorySize64' threw an exception of type 'System.InvalidOperationException' long {System.InvalidOperationException}
+ PeakWorkingSet 'getIDs.PeakWorkingSet' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException}
+ PeakWorkingSet64 'getIDs.PeakWorkingSet64' threw an exception of type 'System.InvalidOperationException' long {System.InvalidOperationException}
+ PriorityBoostEnabled 'getIDs.PriorityBoostEnabled' threw an exception of type 'System.InvalidOperationException' bool {System.InvalidOperationException}
+ PriorityClass 'getIDs.PriorityClass' threw an exception of type 'System.InvalidOperationException' System.Diagnostics.ProcessPriorityClass {System.InvalidOperationException}
+ PrivateMemorySize 'getIDs.PrivateMemorySize' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException}
+ PrivateMemorySize64 'getIDs.PrivateMemorySize64' threw an exception of type 'System.InvalidOperationException' long {System.InvalidOperationException}
+ PrivilegedProcessorTime {00:00:00.0468750} System.TimeSpan
+ ProcessName 'getIDs.ProcessName' threw an exception of type 'System.InvalidOperationException' string {System.InvalidOperationException}
+ ProcessorAffinity 'getIDs.ProcessorAffinity' threw an exception of type 'System.InvalidOperationException' System.IntPtr {System.InvalidOperationException}
+ Responding 'getIDs.Responding' threw an exception of type 'System.InvalidOperationException' bool {System.InvalidOperationException}
+ SessionId 'getIDs.SessionId' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException}
+ StandardError {System.IO.StreamReader} System.IO.StreamReader
+ StandardInput {System.IO.StreamWriter} System.IO.StreamWriter
+ StandardOutput {System.IO.StreamReader} System.IO.StreamReader
+ StartInfo {System.Diagnostics.ProcessStartInfo} System.Diagnostics.ProcessStartInfo
+ StartTime {10/4/2011 1:03:09 AM} System.DateTime
SynchronizingObject null System.ComponentModel.ISynchronizeInvoke
+ Threads 'getIDs.Threads' threw an exception of type 'System.InvalidOperationException' System.Diagnostics.ProcessThreadCollection {System.InvalidOperationException}
+ TotalProcessorTime {00:00:00.0781250} System.TimeSpan
+ UserProcessorTime {00:00:00.0312500} System.TimeSpan
+ VirtualMemorySize 'getIDs.VirtualMemorySize' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException}
+ VirtualMemorySize64 'getIDs.VirtualMemorySize64' threw an exception of type 'System.InvalidOperationException' long {System.InvalidOperationException}
+ WorkingSet 'getIDs.WorkingSet' threw an exception of type 'System.InvalidOperationException' int {System.InvalidOperationException}
+ WorkingSet64 'getIDs.WorkingSet64' threw an exception of type 'System.InvalidOperationException' long {System.InvalidOperationException}
+ Static members System.Diagnostics.Process System.Diagnostics.Process
+ Non-Public members {System.Diagnostics.Process} System.Diagnostics.Process
'getIDs.MainModule' threw an exception of type 'System.ComponentModel.Win32Exception' Too many characters in character literal
Run Code Online (Sandbox Code Playgroud)
另一个编辑:我发现我在系统事件查看器中收到此错误.直到现在我才注意到它."应用程序弹出:XTandemAdapter.exe - 应用程序错误:应用程序无法正确初始化(0xe06d7363).单击"确定"终止应用程序.
这有助于任何人理解这个问题.我应该注意,可执行文件确实需要使用一些dll,尽管根据依赖walker这些都可以找到.
不过,为什么没有记录事件则要有趣得多。我建议您System.Diagnostics.Debugger.Break();
在应用程序的第一行添加一个。这将允许您在调用调试器后附加调试器,然后您可以观察其行为。