title: Why can't I return a char* string from C++ to C# in a Release build?
body: <p>I'm attempting to call the following trivial C function from C#:</p>
  
  <pre><code>SIMPLEDLL_API const char* ReturnString()
  {
      return "Returning a static string!";
  }
  </code></pre>
  
  <p>With the following P/Invoke declaration (with or without the return attribute, it makes no difference):</p>
  
  <pre><code>[DllImport("SimpleDll")]
  [return: MarshalAs(UnmanagedType.LPStr)]
  public static extern string ReturnString();
  </code></pre>
  
  <p>It works if the DLL is a Debug build but crashes in a Release build (AccessViolationException).</p>
  
  <p>I am calling over a dozen other simple functions and this is the only one that fails (here are the others:)</p>
  
  <pre><code>[DllImport("SimpleDll")] public static extern int NextInt();
  [DllImport("SimpleDll")] public static extern void SetNextInt(int x);
  [DllImport("SimpleDll")] public static extern int AddInts(int a, int b);
  [DllImport("SimpleDll")] public static extern int AddFourInts(int a, int b, int c, int d);
  [DllImport("SimpleDll")] public static extern double AddDoubles(double x, double y);
  [DllImport("SimpleDll")] public static extern IntPtr AddDoublesIndirect(ref double x, ref double y);
  [DllImport("SimpleDll")] [return: MarshalAs(UnmanagedType.U1)]
  public static extern char CharStringArgument([MarshalAs(UnmanagedType.LPStr)]string s);
  [DllImport("SimpleDll")] [return: MarshalAs(UnmanagedType.U2)]
  public static extern char WCharStringArgument([MarshalAs(UnmanagedType.LPWStr)]string s);
  [DllImport("SimpleDll")] [return: MarshalAs(UnmanagedType.LPWStr)]
  public static extern string ReturnWString();
  [DllImport("SimpleDll")] [return: MarshalAs(UnmanagedType.BStr)]
  public static extern string ReturnBSTR();
  [DllImport("SimpleDll")] public static extern System.Drawing.Point MakePoint(int x, int y);
  [DllImport("SimpleDll")] public static extern IntPtr MakePointIndirect(int x, int y);
  [DllImport("SimpleDll")] public static extern int GetPointY(System.Drawing.Point p);
  [DllImport("SimpleDll")] public static extern int GetPointYIndirect(ref System.Drawing.Point pp);
  [DllImport("SimpleDll")] public static extern int SumIntegers(ref int firstElem, int size);
  </code></pre>