Como faço para empacotar uma estrutura como um ponteiro para uma estrutura?
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) {...
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