erro PInvoke quando empacotamento struct com uma corda nele
-
11-07-2019 - |
Pergunta
Eu tenho um C ++ struct
struct UnmanagedStruct
{
char* s;
// Other members
};
e C # struct
struct ManagedStruct {
[MarshalAs(UnmanagedType.LPStr)]
string s;
// Other members
}
do C ++ expõe biblioteca
extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );
E ele é importado como
[DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
static extern ManagedStruct foo( string input );
No entanto, quando eu chamar essa função I get
MarshalDirectiveException foi não processada
assinatura de tipo de método não é PInvoke compatível.
A coisa é, esta chamada de função funciona se eu remover o char * s ea cadeia s das estruturas.
Solução
Para este tipo de cenário, não utilizar uma string diretamente. Em vez disso mudar o tipo de ser um valor IntPtr e usar Marshal.PtrToStringAuto / ANSI / Uni conforme apropriado. Neste caso, uma vez que o seu usa código char*
nativa, PtrToStringAnsi é a melhor escolha.
struct ManagedStruct {
IntPtr s;
public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow