Question

I have a C++ struct

struct UnmanagedStruct
{
   char* s;
   // Other members
};

and a C# struct

struct ManagedStruct {
   [MarshalAs(UnmanagedType.LPStr)]
   string s;
   // Other members
}

the C++ library exposes

extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );

And it is imported like

  [DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
  static extern ManagedStruct foo( string input );

However when I call this function I get

MarshalDirectiveException was unhandled

Method's type signature is not PInvoke compatible.

The thing is, this function call works if I remove the char* s and the string s from the structs.

Was it helpful?

Solution

For this type of scenario, do not use a String directly. Instead switch the type to be an IntPtr value and use Marshal.PtrToStringAuto/Ansi/Uni as appropriate. In this case, since your native code uses char*, PtrToStringAnsi is the best choice.

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top