"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que as chamadas C# `CDECL` e C ++` __STDCALL` As assinaturas coexistem em P/Invoke?

Por que as chamadas C# `CDECL` e C ++` __STDCALL` As assinaturas coexistem em P/Invoke?

Postado em 2025-03-24
Navegar:302

Why Do C# `Cdecl` Calls and C   `__stdcall` Signatures Coexist in P/Invoke?

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.

Tutorial mais recente Mais>

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