title: Exporting functions from C++ dll to C# P/Invoke
body: <p>I have built a C++ dll that I would like to call from C# code. I'm able to call one function, but the other throws an exception when the C# code tries to load the dll.</p>
  
  <p>The header looks like this:</p>
  
  <pre><code>extern "C" __declspec(dllexport) BOOL Install();
  extern "C" __declspec(dllexport) BOOL PPPConnect();
  </code></pre>
  
  <p>This produces a dll with slightly confusing exports table (what does foo = foo mean in the name field?):</p>
  
  <pre><code>File Type: DLL
  
  Section contains the following exports for PPPManager.dll
  
  00000000 characteristics
  499F44F0 time date stamp Fri Feb 20 16:04:00 2009
      0.00 version
         1 ordinal base
         2 number of functions
         2 number of names
  
  ordinal hint RVA      name
  
        1    0 000078E4 Install = Install
        2    1 000079DC PPPConnect = PPPConnect
  </code></pre>
  
  <p>My P/Invoke declarations look like this:</p>
  
  <pre><code>[DllImport("PPPManager.dll")]
  private static extern bool Install();
  
  [DllImport("PPPManager.dll")]
  private static extern bool PPPConnect();
  </code></pre>
  
  <p>The call to Install returns with no exception, but when I call PPPConnect, I get a MissingMethodException - "Can't find an Entry Point 'PPPConnect' in a PInvoke DLL 'PPPManager.dll'."</p>
  
  <p>I've tried removing the extern and declspec directives from the Install function declaration, so that PPPConnect is the only function exported, and this still doesn't let me call PPPConnect.</p>
  
  <p>I have also tried doing the DllImport by ordinal; this gives the same result as calling by name - Install returns, but PPPConnect throws the exception "Can't find an Entry Point '#2'...".</p>
  
  <p>The interop log gives:</p>
  
  <pre><code>[pinvokeimpl][preservesig]
  bool  invivodata.Common.System.IPAQUtils::Install();
  BOOLEAN (I1_WINBOOL_VAL) Install();
  
  JIT ERROR FOR PINVOKE METHOD (Managed -&gt; Native): 
  [pinvokeimpl][preservesig]
  bool  invivodata.Common.System.IPAQUtils::PPPConnect();
  BOOLEAN (I1_WINBOOL_VAL) PPPConnect();
  </code></pre>
  
  <p>This is well outside my area of expertise, so any suggestions or thoughts would be welcome.</p>
  
  <p>Thanks,
  Paul</p>
  
  <p>edit:
  It turns out that this code does work; the problem was with the latest dll not being propagated to the device. D'oh!</p>