Création automatique de C# enveloppes de c-têtes?
Est-il un moyen de créer automatiquement des p/invoke des wrappers pour .net à partir d'un en-tête c?
Bien sûr, je pourrais créer à la main, mais leur maintien serait douloureux, et je serais probablement faire une erreur quelque part résultant en difficile à déboguer se bloque.
J'ai essayé de GORGÉE, mais il a créé plein de classes dont les structures seraient suffisantes.
Un autre problème avec SWIG est qu'il nécessite plus d'interopérabilité de code sur le côté c.
Je préfère si la sortie a travaillé sur mono aussi, mais qui n'est pas nécessaire.
Une autre chose que j'ai pu travailler avec est un programme qui analyse l'en-tête c, et crée une sortie dans un joli format intermédiaire comme xml, à partir de laquelle je peux créer le C# wrapper moi-même.
Edit:
PInvoke Interop Assistant est ce dont j'avais besoin.
Il y a quelques petits problèmes avec elle si:
* Il se traduit par "unsigned char*" à la chaîne où je préfère IntPtr
* Il suppose que size_t=int=long=32 bits. C'est actuellement le cas pour moi, mais ne pourrait pas vrai sur chaque plate-forme.
Est-il propre moyen de corriger ça? Sinon, je vais utiliser un peu de trouver et de remplacer dans le code c avant de le convertir.
Vous devez vous connecter pour publier un commentaire.
La PInvoke Interop Assistant devrait être un meilleur ajustement pour vous, il a été spécifiquement conçu pour travailler avec du code C.
Méfiez-vous cependant qu'aucun outil vous donne une garantie à 100% de la solution, C déclarations sont façon trop ambiguë pour assurer un fonctionnement sans résultat. Problèmes causés par des pointeurs, omniprésent dans le code C. Il n'y a aucun moyen de dire qu'un pointeur est utilisé pour lire ou écrire la mémoire. Ou les deux. Ou qui est chargé de libérer la mémoire qui est en cours de pointue de.
C'est l'un des principaux hangup statique des analyseurs de code ainsi, ils ne peuvent pas faire un travail décent si ils ne savent pas comment un pointeur est utilisé. Ils ne peuvent déduire de l'usage, mais c'est un poulet et des œufs problème, l'utilisation qui peut être erroné. Microsoft a résolu le problème dans leurs propres en-têtes avec SAL annotations, extra balisage qui est neutre à un compilateur, mais peut être analysé par un analyseur de code. Ils explicitement état de l'utilisation prévue d'un pointeur.
Également utilisé par le Pinvoke Interop Adjoint, qui est pourquoi il peut faire un meilleur travail sur la winapi déclarations. Mais qui bien sûr ne fonctionne que sur Microsoft des en-têtes, ces SAL annotations sont normalement manquants sur le code écrit par un occupé programmeur C.
System.Runtime.InteropServices
pour chaque attribut).Si je comprends votre question correctement, vous êtes essentiellement en demandant si il y a un moyen de faire ce RASADE n'.
Bien sûr, vous voulez le faire un peu différemment, donc, une option serait de prendre le RASADE de code et de le modifier pour fonctionner de la manière que vous souhaitez.