C# CDECL
e C __ stdcall
Razões para a coexistência em p/Invoke
Em p/Invoke Interoperabilidade entre C# e C, geralmente é o caso de que as funções C# usam a convenção de chamadas CDECL
, enquanto suas funções correspondentes usam a assinatura __ stdcall
. Essa incompatibilidade decorre da seleção da Convenção de Calls que foi historicamente continuada até hoje.
__ stdcall
: o chamador da função do Windows limpe
__ stdcall
herda da convenção de chamada de Pascal de 16 bits e é a convenção de chamada padrão para as funções da API e com. Ele especifica que o callee (a função que está sendo chamado) limpa a pilha após a execução, tornando-a mais compacta em ambientes com restrição de recursos. No entanto, se o número de parâmetros esperados pelo chamador e pelo Callee não corresponder, essa vantagem representar o risco de desequilíbrio da pilha.
__ CDECL
: limpeza de chamadas da função do parâmetro mutável
__ CDECL
é uma convenção de chamada padrão em c para funções com número variável de parâmetros, como printf ()
e scanf ()
. Esta convenção coloca a responsabilidade pela limpeza da pilha no chamador, porque o chamador conhece o número de parâmetros aprovados. Esqueceu de especificar CallingConvention.cdecl
na declaração [dllimport]
em C# é uma armadilha comum.
__ thisCall
: ocultar este ponteiro do método C
__ thisCall
refere -se especificamente a c, que lida com a passagem de Hidden this
ponteiros na instância do método da classe. É semelhante a __ CDECL
, mas o .Net P/Invoke Marshalling Handler não o suporta e, portanto, não é adequado para o código C Pinvoke.
Resumir
A coexistência do CDECL Call in
em C# e o __ stdcall
assinatura em c é o resultado dessas convenções de chamada histórica e cada requisitos específicos do idioma. O entendimento adequado dessas convenções, bem como as propriedades EntryPoint
e as propriedades do ExactSpelling
de são críticas para garantir a funcionalidade p/invoque correta e evitar possíveis problemas como o desequilíbrio da pilha.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3