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.

Foi útil?

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
scroll top