title: Static Variable Null In Method Call, But Initialized In Program
body: <p>I have a bit of a head-scratcher here that I wonder if someone may know the answer to.</p>
  
  <p>The setup is basically this:</p>
  
  <pre><code>//in Visual Studio plug-in application
  SpinUpProgramWithDebuggerAttached();
  
  //in spun up program
  void Start()
  {
      StaticClass.StaticVariable = "I want to use this.";
      XmlSerializer.Deserialize(typeof(MyThingie), "xml");
  }
  
  class MyThingie : IXmlSerializable
  {
       ReadXml()
       {
           //why the heck is this null?!?
           var thingIWantToUse = StaticClass.StaticVariable;
       }
  }
  </code></pre>
  
  <p>The problem that has me pulling my hair out is that StaticClass.StaticVariable is null in the IXmlSerializable.ReadXml() method, even though it's called RIGHT AFTER the variable is set.</p>
  
  <p>Of note is that breakpoints aren't hit and Debugger.Launch() is ignored in the precise spot the problem occurs. </p>
  
  <p>Mysteriously, I determined through raising exceptions that the AppDomain.CurrentDomain.FriendlyName property is the same for the place the static variable is populated vs. null!</p>
  
  <p>Why the heck is the static variable out of scope?!? What's going on?!? How can I share my variable?</p>
  
  <p>EDIT:</p>
  
  <p>I added a static constructor, per a suggestion in the responses, and had it do a Debug.WriteLine. I noticed it was called twice, even though all the code appears to be running in the same AppDomain. Here is what I see in the output window, which I'm hoping will be a useful clue:</p>
  
  <p><i><b>Static constructor called at: 2015-01-26T13:18:03.2852782-07:00</p>
  
  <p>...Loaded 'C:...\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll'...</p>
  
  <p>...Loaded 'Microsoft.GeneratedCode'... </p>
  
  <p>...Loaded 'C:...\GAC_MSIL\System.Xml.Linq\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.Linq.dll'....</p>
  
  <p>...Loaded 'C:\USERS...\APPDATA\LOCAL\MICROSOFT\VISUALSTUDIO\12.0EXP\EXTENSIONS...SharePointAdapter.dll'. Symbols loaded.</p>
  
  <p>...Loaded 'Microsoft.GeneratedCode'. </p>
  
  <p>Static constructor called at: 2015-01-26T13:18:03.5196524-07:00</b></I></p>
  
  <p>ADDITIONAL DETAIL:</p>
  
  <p>Here is the actual code, since a couple of commenters thought it might help:</p>
  
  <pre><code>//this starts a process called "Emulator.exe"
  var testDebugInfo = new VsDebugTargetInfo4
  {
      fSendToOutputWindow = 1,
      dlo = (uint)DEBUG_LAUNCH_OPERATION.DLO_CreateProcess,
      bstrArg = "\"" + paramPath + "\"",
      bstrExe = EmulatorPath, 
      LaunchFlags = grfLaunch | (uint)__VSDBGLAUNCHFLAGS.DBGLAUNCH_StopDebuggingOnEnd | (uint)__VSDBGLAUNCHFLAGS.DBGLAUNCH_WaitForAttachComplete,
      dwDebugEngineCount = 0,
      guidLaunchDebugEngine = VSConstants.CLSID_ComPlusOnlyDebugEngine,
  };
  
  var debugger = Project.GetService(typeof(SVsShellDebugger)) as IVsDebugger4;
  var targets = new[] { testDebugInfo };
  var processInfos = new[] { new VsDebugTargetProcessInfo() };
  
  debugger.LaunchDebugTargets4(1, targets, processInfos);
  
  //this is in the emulator program that spins up
  public partial class App : Application
  {
      //***NOTE***: static constructors added to static classes.
      //Problem still occurs and output is as follows (with some load messages in between):
      //
      //MefInitializer static constructor called at: 2015-01-26T15:34:19.8696427-07:00
      //ContainerSingleton static constructor called at: 2015-01-26T15:34:21.0609845-07:00. Type: SystemTypes.ContainerSingleton, SystemTypes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=...
      //ContainerSingleton static constructor called at: 2015-01-26T15:34:21.3399330-07:00. Type: SystemTypes.ContainerSingleton, SystemTypes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=...
  
      protected override void OnStartup(StartupEventArgs e)
      {
           //...
  
           //initializes a MEF container singleton (stored as static variable)
           MefInitilizer.Run(); 
  
           //here's where it blows up. the important details are that 
           //FullSelection implements IXmlSerializable, and its implemention
           //ends up referencing the MEF container singleton, which ends up
           //null, even though it was initialized in the previous line.
           //NOTE: the approach works perfectly under a different context
           //so the problem is not the code itself, per se, but a problem
           //with the code in the environment it's running in.
           var systems = XmlSerialization.FromXml&lt;List&lt;FullSelection&gt;&gt;(systemsXml);
      }
   }
  
  public static class MefInitilizer
  {
      static MefInitilizer() { Debug.WriteLine("MefInitializer static constructor called at: " + DateTime.Now.ToString("o")); }
  
      public static void Run()
      {
          var catalog = new AggregateCatalog();
          //this directory should have all the defaults
          var dirCatalog = new DirectoryCatalog(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
          //add system type plug-ins, too
          catalog.Catalogs.Add(dirCatalog);
  
          var container = new CompositionContainer(catalog);
          ContainerSingleton.Initialize(container);
      }
  }
  
  public class ContainerSingleton
  {
      static ContainerSingleton() 
      {
          Debug.WriteLine("ContainerSingleton static constructor called at: " + DateTime.Now.ToString("o") + ". Type: " + typeof(ContainerSingleton).AssemblyQualifiedName);
      }
      private static CompositionContainer compositionContainer;
  
      public static CompositionContainer ContainerInstance
      {
          get 
          {
              if (compositionContainer == null)
              {
                  var appDomainName = AppDomain.CurrentDomain.FriendlyName;
                  throw new Exception("Composition container is null and must be initialized through the ContainerSingleton.Initialize()" + appDomainName);
              }
              return compositionContainer; 
          }
      }
  
      public static void Initialize(CompositionContainer container)
      {
          compositionContainer = container;
      }
  }
  </code></pre>