PInvoke error when marshalling struct with a string in it
-
11-07-2019 - |
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.
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