Colección de citas famosas - Slogan de motivación - c#Cómo llamar a una clase en C

c#Cómo llamar a una clase en C

Básicamente, la respuesta es que no se puede ajustar debido a nombres de referencia y convenciones de llamadas. Esto debe partir del principio de las clases derivadas de VC.

Una clase es esencialmente una estructura de datos y una operación encapsulada. La estructura de datos se define en el archivo de encabezado y se puede acceder a ella durante la compilación; las funciones miembro se exportan desde la dll. Al exportar una biblioteca de clases C, estos nombres de funciones se expandirán de acuerdo con los estándares del compilador, por ejemplo

Clase B {

int operator (int a, int b);

};

Las funciones miembro del operador internas en realidad se compilarán en funciones similares a las siguientes:

int _ _ esta llamada B _ operador XXXXXX (B * _ this, int a, int B);

(La palabra clave _ __thiscall en realidad no se encuentra en C)

Noté que se agregó algo así como un galimatías después del nombre, que es un sufijo generado automáticamente por el compilador de C según la siguiente lista de parámetros. Gracias a este sufijo, en el código pueden coexistir funciones y funciones miembro con el mismo nombre y diferentes parámetros (la llamada sobrecarga).

En otras palabras, si desea llamar a una función en la biblioteca de clases C, al menos debe saber con qué nombre el compilador compila la función, pero de hecho, los resultados compilados por diferentes compiladores son diferentes. de.

En realidad, esto no es un problema. Si los detalles de salida se configuran en el momento de la compilación, hay una manera de averiguar en qué está compilado el nombre real. Un problema más serio proviene de la convención de llamada:

Como se mencionó anteriormente, las funciones miembro de C adoptan la convención de llamada de __thiscall. La llamada convención de llamada se refiere a la convención sobre cómo pasar parámetros al llamar a una función, en qué orden se pasan y quién es responsable de limpiar la pila. El atributo [DllImport] del programa administrado no admite la convención de llamada de _ __thiscall.

Por supuesto, no se descarta que se puedan llamar algunos métodos indirectos. Aún así es muy recomendable.