2012-02-23 2 views
0

Nous avons embauché un programmeur C pour développer un composant natif pour une utilisation dans une application .NET. Nous avons convenu d'une API conceptuelle. Je vais passer sa méthode à deux tableaux et il va redonner un tableau. J'ai le code aujourd'hui. Voici le fichier d'en-tête. Les vrais noms sont obscurcies:Consommer DLL native en C#

__declspec(dllexport) int NativeMethod(
    struct params * config, 
    int c_input_a_rows, 
    struct input_a_row *input_a_rows, 
    int c_input_b_rows, 
    struct input_b_row *input_b_rows, 
    int c_count, 
    int *p_c_output_rows, 
    struct output_row * output_rows); 

struct params 
{ 
    int a; 
    int b; 
    int c; 
    double d; 
    double e; 
    int f; 
    int g; 
    char h[1000]; 
}; 

struct input_a_row 
{ 
    int a; 
    int b; 
    double c; 
}; 

struct input_b_row 
{ 
    int a; 
    int b; 
    int c; 
    int d; 
    int e; 
    double f; 
    double g; 
}; 

struct output_row 
{ 
    int a; 
    int b; 
    int c; 
    int d; 
    int e; 
    int f; 
    int g; 
    double h; 
    double i; 
    double j; 
}; 

A partir de ce que je généré code .NET en utilisant P/Invoke Interop Assistant. Je n'ai pas réussi à l'obtenir en ouvrant la DLL. Il s'est plaint que le fichier n'a pas de manifeste d'assembly. Donc, je l'ai branché le fichier d'en-tête dans le SigImpl Traduire Snipped et a obtenu ceci:

[DllImport("the.dll", EntryPoint="NativeMethod")] 
public static extern int NativeMethod(
    ref params config, 
    int c_input_a_rows, 
    ref input_a_row input_a_rows, 
    int c_input_b_rows, 
    ref input_b_row input_b_rows, 
    int c_count, 
    ref int p_c_output_rows, 
    ref output_row output_rows); 

Il crée aussi tout comme struct comme prévu. Chacun a un attribut de classe:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 

Deux questions. Ce code a-t-il généré correctement? Deuxièmement, comment l'utiliser? La signature n'a pas de tableaux. Je sais que je dois probablement utiliser des pointeurs, mais comment? Je ne m'attends pas à ce que vous résolviez cela pour moi, mais pouvez-vous me montrer un moyen de comprendre comment le comprendre sans suivre un cours en programmation native faible? Merci!

Répondre

0

Bon, après avoir posté cette question, j'ai recommencé à pirater. La première chose que j'ai essayé a fonctionné!

private static extern int NativeMethod(
     params config, 
     input_a_row[] input_a_rows, 
     input_b_row[] input_b_rows, 
     int count, 
     ref output_row[] output_rows); 

Il y a une autre chose que je devais faire. Je recevais une erreur que le point d'entrée n'a pas été trouvé. J'ai résolu ceci en employant DUMPBIN (de la console de VS) pour découvrir que l'exportation a été réellement appelée [email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z. Comme c'est fragile ?!

+0

Pour désactiver la gestion des noms C++, déclarez-les comme extern "C". Google pour la syntaxe exacte. –

+0

Ou utilisez un fichier .def sur le côté C des choses qui dira exactement à l'éditeur de liens comment nommer la fonction. –

Questions connexes