title: Why does a process started in a DLL file work when tested using console application, but not when called by another DLL file?
body: <p>Last week I posted the question <em><a href="https://stackoverflow.com/questions/7479226/how-can-i-obtain-console-application-output-when-running-it-as-a-process-in-a-c">How can I obtain console application output when running it as a process in a C# DLL file?</a></em> as I was trying to find out the cause of a problem I was having. However, I have not been able to find the reason I was getting an error, so I thought I would ask a follow up that is directly about the problem I am having.</p>
  <p>I am working on method in a DLL file and I have to start a process in it. The code used to do this is:</p>
  <pre><code>ProcessStartInfo psi = new ProcessStartInfo();
  psi.UseShellExecute = false;
  psi.ErrorDialog = false;
  psi.RedirectStandardError = true;
  psi.RedirectStandardOutput = true;
  psi.RedirectStandardInput = true;
  psi.CreateNoWindow = true;
  psi.FileName = @&quot;C:\Program Files\OpenMS-1.6\XTandemAdapter.exe&quot;;
  psi.Arguments = @&quot;-ini C:\XTandemAdapter.ini&quot;;
  
  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(&quot;FMANWiff&quot;, &quot;ID output: &quot; + outputReader.ReadToEnd());
  System.Diagnostics.EventLog.WriteEntry(&quot;FMANWiff&quot;, &quot;ID error: &quot; + errorReader.ReadToEnd());
  </code></pre>
  <p>The application XTandemAdapter.exe is normally run as a console application and the FileName and Arguments are meant to reproduce this format:</p>
  <pre><code>XtandemAdapter.exe -ini XTandemAdapter.ini
  </code></pre>
  <p>I have a console test application that calls my method in this DLL file.  When I use this I am able to see the results of the redirect of standoutput and I can see that the process executed successfully (the executable that is called also produces an XML file as output and I can see that this was created).  However, the normal mode of operation has a application call a method in a DLL which in turn ends up calling mine.  When I run it this way I can see that the process was created by looking in the task manager, but it quickly exits and there is no output to the eventlog and no output file is created by the executable that was run.</p>
  <p>Why would it run properly in one case, but not in another? Is something done differently when called via console application vs. being called by a method in a DLL file?</p>
  <p>I noticed that the Exitcode returned by the process is Exitcode: -529697949 so I guess something is going wrong within the process. I will take a look at the code for xtandemadapter and try to figure out where this is coming from. When I run it from the console application it returns 0.</p>
  <p>When I added the debugger break statement, I ended up stepping through the method and watched the value of the process objects, both when using the console test application and the real world use. I found differences, but I am not sure what to make of them.</p>
  <p>Working console test application:</p>
  <pre><code>-       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 &quot;.&quot; string
  +       MainModule  'getIDs.MainModule' threw an exception of type 'System.ComponentModel.Win32Exception'   System.Diagnostics.ProcessModule {System.ComponentModel.Win32Exception}
  +       MainWindowHandle    0   System.IntPtr
          MainWindowTitle &quot;&quot;  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 &quot;XTandemAdapter&quot;    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      
  </code></pre>
  <p>When I call the dll as I expect to and when it does not work:</p>
  <pre><code>-       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 &quot;.&quot; string
  -       MainModule  'getIDs.MainModule' threw an exception of type 'System.ComponentModel.Win32Exception'   System.Diagnostics.ProcessModule {System.ComponentModel.Win32Exception}
  +       base    {&quot;Access is denied&quot;}    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    {&quot;Process has exited, so the requested information is not available.&quot;}  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    
  </code></pre>
  <p>I found that I was getting this error in the system event viewer. I had not noticed it until now.</p>
  <blockquote>
  <p>&quot;Application popup: XTandemAdapter.exe - Application Error : The application failed to initialize properly (0xe06d7363). Click on OK to terminate the application.&quot;</p>
  </blockquote>
  <p>Does this help anyone understand the problem? I should note, the executable does need to make use of a few DLL files, though according to dependency walker these are all found.</p>