title: .NET2.0 C# Interop: How to call COM code from C#?
body: <p>In my last development environment, I was able to easily interact with COM, calling methods on COM objects. Here is the original code, translated into C# style code (to mask the original language):</p>
  
  <pre><code>public static void SpawnIEWithSource(String szSourceHTML)
  {
      OleVariant ie; //IWebBrowser2
      OleVariant ie = new InternetExplorer();
      ie.Navigate2("about:blank");
  
      OleVariant webDocument = ie.Document;
      webDocument.Write(szSourceHTML);
      webDocument.close;
  
      ie.Visible = True;
  }
  </code></pre>
  
  <p>Now begins the tedious, painful, process of trying to interop with COM from managed code.</p>
  
  <p>PInvoke.net already contains the <a href="http://pinvoke.net/default.aspx/Interfaces/IWebBrowser2.html" rel="nofollow noreferrer">IWebBrower2 translation</a>, the relavent porition of which is:</p>
  
  <pre><code>[ComImport, 
     DefaultMember("Name"), 
     Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E"), 
     InterfaceType(ComInterfaceType.InterfaceIsIDispatch), 
     SuppressUnmanagedCodeSecurity]
  public interface IWebBrowser2
  {
      [DispId(500)]
      void Navigate2([In] ref object URL, [In] ref object Flags, [In] ref object TargetFrameName, [In] ref object PostData, [In] ref object Headers);
  
      object Document { [return: MarshalAs(UnmanagedType.IDispatch)] [DispId(0xcb)] get; }
  }
  </code></pre>
  
  <p>I've created the COM class:</p>
  
  <pre><code>[ComImport]
  [Guid("0002DF01-0000-0000-C000-000000000046")]
  public class InternetExplorer
  {
  }
  </code></pre>
  
  <p>So now it's time for my actual C# transaction:</p>
  
  <pre><code>public static void SpawnIEWithSource(String szHtml)
  {
      PInvoke.ShellDocView.IWebBrowser2 ie;
      ie = (PInvoke.ShellDocView.IWebBrowser2)new PInvoke.ShellDocView.InternetExplorer();
  
      //Navigate to about:blank to initialize the browser
      object o = System.Reflection.Missing.Value;
      String url = @"about:blank";
      ie.Navigate2(ref url, ref o, ref o, ref o, ref o);
  
      //stuff contents into the document
      object webDocument = ie.Document;
      //webDocument.Write(szHtml);
      //webDocument.Close();
  
      ie.Visible = true;
  }
  </code></pre>
  
  <p>The careful readers notice that IWebBrowser2.Document is a late-bound IDispatch. 
  We're using Visual Studio 2005, with .NET 2.0 on our, and our customer's, machines.</p>
  
  <p>So what's the .NET 2.0 method to invoke methods on an object that, on some level, only supports late-bound IDispatch?</p>
  
  <p>A quick search of Stack Overflow for using IDispatch from C# turns up <a href="https://stackoverflow.com/questions/403218/does-c-net-support-idispatch-late-binding">this post</a> saying what I want is not possible in .NET.</p>
  
  <p>So is it possible to use COM from C# .NET 2.0?</p>
  
  <hr>
  
  <p>The question is that there is an accepted design pattern that I want to use in C#/.NET. It involves launching Internet Explorer out of process, and giving it HTML content, all the while not using temporary files.</p>
  
  <p>A rejected design idea is hosting Internet Explorer on a WinForm.</p>
  
  <p>An acceptable alternative is launching the system registered web browser, giving it HTML to display, without using a temporary file.</p>
  
  <p>The stumbling block is continuing to use COM objects in the .NET world. The specific problem involves performing late-binding calls to IDispatch without needing C# 4.0. (i.e. while using .NET 2.0)</p>