title: Using a method to get Embedded Font Causes Protected Memory Error
body: <p>I am using this code to get an embedded font:</p>
  
  <pre><code>/// &lt;summary&gt;
      /// Returns an Embedded Font
      /// &lt;/summary&gt;
      /// &lt;param name="ImagePath"&gt;String begins with namespace e.g MyProgram.Image.png&lt;/param&gt;
      /// &lt;returns&gt;&lt;/returns&gt;
      public static Font GetEmbeddedFont(string FontPath, float Size)
      {
          Font _font = null;
          Thread getFontThread = new Thread(() =&gt; GetFont(FontPath, Size, out _font));
          getFontThread.Start();
          getFontThread.Join();
          return _font;            
      }
      #region GetFont
      private static void GetFont(string FontPath, float Size, out Font FontOut)
      {
          Font fnt = null;
          Assembly asm = Assembly.GetExecutingAssembly();
          Stream resStream = asm.GetManifestResourceStream(FontPath);
          if (null != resStream)
          {
              // 
              // GDI+ wants a pointer to memory, GDI wants the memory.
              // We will make them both happy.
              //
              // First read the font into a buffer
              byte[] rgbyt = new Byte[resStream.Length];
              resStream.Read(rgbyt, 0, rgbyt.Length);
              resStream.Close();
              // Then do the unmanaged font (Windows 2000 and later)
              // The reason this works is that GDI+ will create a font object for
              // controls like the RichTextBox and this call will make sure that GDI
              // recognizes the font name, later.
              uint cFonts;
              AddFontMemResourceEx(rgbyt, rgbyt.Length, IntPtr.Zero, out cFonts);
              // Now do the managed font
              IntPtr pbyt = Marshal.AllocCoTaskMem(rgbyt.Length);
              if (null != pbyt)
              {
                  Marshal.Copy(rgbyt, 0, pbyt, rgbyt.Length);
                  m_pfc = new PrivateFontCollection();
                  m_pfc.AddMemoryFont(pbyt, rgbyt.Length);
                  Marshal.FreeCoTaskMem(pbyt);
              }
          }
  
          if (m_pfc.Families.Length &gt; 0)
          {
              // Handy how one of the Font constructors takes a
              // FontFamily object, huh? :-)
              fnt = new Font(m_pfc.Families[0], Size);
          }
          m_pfc.Dispose();    
          FontOut = fnt;            
      }
  </code></pre>
  
  <p>I use a Thread to attempt to wait for it to finish, because the error seems to occur, if this method is called multiple times within a short space of time.</p>
  
  <p>How can I stop this error occuring, I think it has something to do with the method being called within quick succession of each other.</p>
  
  <p>I get the exception here:</p>
  
  <pre><code>_font = value;
              using (Graphics g = _parent.CreateGraphics())
              {
                  SizeF soize = g.MeasureString(_text, _font);
                  _size = new Size((int)soize.Width, (int)soize.Height);
                  _width = _size.Width;
                  _height = _size.Height;
              }
  </code></pre>
  
  <p>On the line    g.MeasureString(_text, _font);</p>
  
  <p>However I know that the error is in the GetEmbeddedFont Method, as it only throws an error if the font is set using the GetEmbeddedFont method.</p>
  
  <p>It will work fine once, but if it is used a second time to shortly after the first, it will throw the error.</p>
  
  <p>And if I debug the code, _font returns this:</p>
  
  <pre><code>{Name = '((System.Drawing.Font)(_font)).fontFamily.Name' threw an exception of type 'System.ArgumentException' Size=15.0}
  </code></pre>