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!
Pour désactiver la gestion des noms C++, déclarez-les comme extern "C". Google pour la syntaxe exacte. –
Ou utilisez un fichier .def sur le côté C des choses qui dira exactement à l'éditeur de liens comment nommer la fonction. –