"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué las llamadas C# `CDECL` y las firmas C ++` __stdcall` coexisten en P/Invoke?

¿Por qué las llamadas C# `CDECL` y las firmas C ++` __stdcall` coexisten en P/Invoke?

Publicado el 2025-03-24
Navegar:101

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

c# cdeCl y c __ stcall para la coexistencia en p/invoke

En P/Invoke interoperabilidad entre C# y C, a menudo es el caso que las funciones de C# usan la Convención CDECL llamadas, mientras que sus funciones C correspondientes usan la firma __ stdcall . Este desajuste proviene de la selección de convenciones de llamadas que históricamente ha continuado hasta el día de hoy.

__ stdcall : la función de llamadas de Windows limpia

__ stdcall hereda de la convención de llamadas PASCAL de 16 bits y es la convención de llamadas predeterminada para las funciones de la API de Windows y com. Especifica que la Callee (la función que se llama) limpia la pila después de la ejecución, lo que la hace más compacta en entornos con recursos limitados. Sin embargo, si el número de parámetros esperados por la persona que llama y el Callee no coincide, esta ventaja plantea el riesgo de desequilibrio de la pila.

__ cdecl : limpieza de llamadas de la función de parámetro mutable

]

__ cdecl es una convención de llamada estándar en C para funciones con un número variable de parámetros, como printf () y scanf () . Esta convención pone la responsabilidad de la limpieza de la pila en la persona que llama, porque la persona que llama sabe la cantidad de parámetros que se pasa. Olvidé especificar callConvention.cdecl en la declaración [dllImport] en C# es una trampa común.

__ thisCall : ocultar este puntero del método C

]

__ thisCall se refiere específicamente a C, que maneja el paso Hidden this Punters en el método de instancia de la clase. Es similar a __ CDECL , pero el controlador .NET P/Invoke Marshalling no lo admite y, por lo tanto, no es adecuado para el código Pinvoke C.

Resumir

La coexistencia de

cdeCl llamar en C# y el __ stdcall en C es el resultado de estas convenciones de llamadas históricas y cada requisitos específicos del lenguaje. La comprensión adecuada de estas convenciones, así como las propiedades de EntryPoint y exactos de son ​​fundamentales para garantizar la funcionalidad P/invocación correcta y evitar posibles problemas como el desequilibrio de la pila.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3