Comment importer l’API vo * C en C #?

Étant donné cette déclaration de l’API C, comment serait-il importé en C #?

int _stdcall z4ctyget(CITY_REC *, void *); 

J’ai pu aller aussi loin:

  [DllImport(@"zip4_w32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "z4ctygetSTD", ExactSpelling = false)] private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr); 

Naturellement, en C #, le “void *” ne comstack pas.

Certains googler indique qu’il devrait être traduit par “object”. Ce qui semble fonctionner. Mais d’autres indiquent que “Void * est appelé un pointeur de fonction en termes C / C ++ qui, en termes C #, est un délégué”. Cela n’a pas beaucoup de sens ici, à quoi serait-il délégué? Certains appels similaires pour d’autres API trouvées via Googling utilisent d’autres fonctions dans les API respectives. Mais dans cette API, aucun autre appel n’aurait de sens.

La documentation de l’appel montre un exemple:

 z4ctyget(&city, “00000”); 

Ce qui semble montrer que même une valeur statique pourrait être passée.

Il comstackra avec object à la place du vide *. Je ne sais pas si c’est correct et je n’ai pas eu l’occasion de le tester (problème de licence).

Pour le paramètre void *, vous pouvez simplement utiliser un IntPtr

  [DllImport(@"zip4_w32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "z4ctygetSTD", ExactSpelling = false)] private extern static int z4ctygetSTD(ref CITY_REC args, IntPtr ptr); 

Vous pouvez également utiliser void * si vous marquez votre classe comme non sécurisée.

Cela dépend vraiment de ce que l’API recherche dans ce paramètre.

Vous pouvez append IntPtr ou Object * pour passer le compilateur passé, mais vous devrez tout de même lui transmettre les données correctes lorsque vous l’appelez.

Autant que je sache, la déclaration C de z4ctyget est:

 int z4ctyget(CITY_REC *cityrec, char *zipcode); 

Le deuxième paramètre est une chaîne ANSI de 5 caractères représentant le code postal auquel vous souhaitez commencer votre recherche ou “00000” pour commencer au début du fichier. Donc, votre déclaration devrait être:

 [DllImport(@"zip4_w32.dll", CharSet = CharSet.Ansi)] private extern static int z4ctygetSTD(ref CITY_REC args, ssortingng zipcode);