title: .Net service failes with FileNotFound exception on new thread starting method
body: <p>I have a service that I wrote that performs core business logic and functionality.  The service is designed as a service wrapper in one project and all the functionality in Windows Library project. I also have console applcaton that also wraps the Windows Library project.</p>
  
  <p>In our pre-production environment, this works just fine. The service starts and everything goes on its merry little way.</p>
  
  <p>In our production enviroment, the service fails to start.</p>
  
  <pre><code>Application: URTWorkerService.exe
  Framework Version: v4.0.30319
  Description: The process was terminated due to an unhandled exception.
  Exception Info: System.IO.FileNotFoundException
  Stack:
     at URTWorker.Worker.Run()
     at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
     at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
     at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
     at System.Threading.ThreadHelper.ThreadStart()
  </code></pre>
  
  <p>I thought this was weird and added a Debug.WriteLine() call to it like so:</p>
  
  <pre><code>/// &lt;summary&gt;
  /// Entry point method into the Worker class
  /// &lt;/summary&gt;
  public void Run()
  {
      Debug.WriteLine("Did we make it this far?");
      var exitEventArgs = ExitEventArgs.Clear;
      try
      {
          BroadcastEcho("Worker::Run::Enter", TraceLevel.Verbose);
          WorkerStartedOn = DateTime.Now;
          State = AsyncState.Running;
  
          BroadcastEcho("Worker::Run::Pre initialize", TraceLevel.Verbose);
          Initialize();
          BroadcastEcho("Worker::Run::Post initialize", TraceLevel.Verbose);
  
          ExecuteWorkerLoop();
      }
      catch (Exception ex)
      {
          exitEventArgs.Reason = ExitReason.Exception;
          var vars = new Dictionary&lt;string, string&gt;();
  
          StandardMessage message;
  
          // TODO Comment about this
          if (ex is FormatException &amp;&amp; ex.Message.Contains("FieldNames.cs"))
          {
              BroadcastEcho("The field definition has changed. Generating new code file.", ex);
              var path = CreateConstantsCodeFile();
              BroadcastEcho("The file has been saved to " + path, TraceLevel.Error);
              vars.Add("FieldsNamesPath", path);
              message = StandardMessage.NewFieldsNameFile;
          }
          else
          {
              BroadcastEcho("An unhandled exception was thrown", ex);
              vars.Add("ExtraInfo", "&lt;b&gt;This is a crashing exception.&lt;/b&gt;");
              message = StandardMessage.UnhandledError;
          }
          Notifier.SendErrorMail(message, vars, ex);
  
      }
  
      var lastCount = -1;
      while (Notifier.MailInTransit.Count &gt; 0)
      {
          if (lastCount != Notifier.MailInTransit.Count)
          {
              var suffix = (
                  lastCount != 1
                      ? "s"
                      : string.Empty);
  
              lastCount = Notifier.MailInTransit.Count;
              BroadcastEcho(string.Format("Waiting for {0} mail item{1} to finish sending", lastCount, suffix), TraceLevel.Info);
          }
  
          Thread.Sleep(0);
      }
  
      State = AsyncState.Stopped;
      BroadcastEcho("Worker::Run::Exit", TraceLevel.Verbose);
      Exit(exitEventArgs);
  }
  </code></pre>
  
  <p>Here's the DbgView capture...</p>
  
  <pre><code>[11864] Program::Main 
  [11864] Verbose::WorkerService::Enter  
  [11864] Verbose::WorkerService::Exit  
  [11864] Info::Starting Worker Service  
  [11864] Verbose::OnStart::Enter  
  [11864] Verbose::OnStart::Worker Service received Start command  
  [11864] Verbose::OnStart::Current directory = C:\Windows\system32  
  [11864] Verbose::OnStart::try::Created workerThread  
  [11864] Verbose::OnStart::try::workerThread started  
  [11864] Verbose::OnStart::try::Done waiting  
  [11864] Verbose::OnStart::Exit  
  </code></pre>
  
  <p>You can see all of the <code>BroadcastEcho()</code> messages as noted the TraceLevel values but the <code>Debug.WriteLine()</code> never appears.</p>
  
  <p>Then I thought that it might be an issue with assembly bindings. Here's the Fusion Log results:</p>
  
  <pre><code>*** Assembly Binder Log Entry  (1/24/2013 @ 7:47:52 AM) ***
  
  The operation was successful.
  Bind result: hr = 0x0. The operation completed successfully.
  
  Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
  Running under executable  C:\RTWorker\URTWorkerService.exe
  --- A detailed error log follows. 
  
  === Pre-bind state information ===
  LOG: User = REDMOND\msrrtsa
  LOG: DisplayName = URTWorker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
   (Fully-specified)
  LOG: Appbase = file:///C:/RTWorker/
  LOG: Initial PrivatePath = NULL
  LOG: Dynamic Base = NULL
  LOG: Cache Base = NULL
  LOG: AppName = URTWorkerService.exe
  Calling assembly : URTWorkerService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
  ===
  LOG: This bind starts in default load context.
  LOG: Using application configuration file: C:\RTWorker\URTWorkerService.exe.Config
  LOG: Using host configuration file: 
  LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
  LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
  LOG: Attempting download of new URL file:///C:/RTWorker/URTWorker.DLL.
  LOG: Assembly download was successful. Attempting setup of file: C:\RTWorker\URTWorker.dll
  LOG: Entering run-from-source setup phase.
  LOG: Assembly Name is: URTWorker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
  LOG: Binding succeeds. Returns assembly from C:\RTWorker\URTWorker.dll.
  LOG: Assembly is loaded in default load context.
  </code></pre>
  
  <p>Both machines are Windows Server 2008 R2 SP1. Preproduction is a virtual machine, production is a physical machine.</p>
  
  <p>Any suggestions as to what it might be?</p>