Como faço para empacotar uma estrutura como um ponteiro para uma estrutura?

StackOverflow https://stackoverflow.com/questions/827672

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu estou tentando passar uma estrutura de C # para a biblioteca C ++. Passo estrutura como um objecto e a função C ++ espera-lo como um ponteiro (* vazio).

Estou tendo problema passando a estrutura.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec);

Aqui está o texto de exceção de tempo de execução eu recebo:

"Não é possível marshal 'parâmetro # 1':. Inválido gerenciado / combinação de tipo não gerenciado (este tipo de valor deve ser emparelhado com Struct)"

Embora eu encontrei um artigo MSDN que usa LPStruct exatamente neste contexto.

Esta é minha estrutura que estou tentando marechal:

[StructLayout(LayoutKind.Sequential)]
public struct UserRec {
    [MarshalAs(UnmanagedType.I4)]
    public int userParam1;
}

Esta é a função C ++:

MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {...
Foi útil?

Solução

Tente passar a estrutura como um parâmetro ref.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction(ref UserRec userRec);

Quando você usa um ref combinado com uma estrutura, é conceitualmente passa o endereço.

Outras dicas

Aliás, UnmanagedType.LPStruct é raramente, ou nunca, o argumento MarshalAs correta. Uma citação de Adam Nathan que é um Microsoft empregado:

UnmanagedType.LPStruct é suportado apenas para um caso específico:. tratamento de um tipo de valor System.Guid como um GUID não gerenciado com um nível extra de indireção

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top