Appeler un type personnalisé à partir d'une DLL écrite en C ++ de c #
-
18-09-2019 - |
Question
J'utilise une DLL écrite en C ++ dans mon projet C #. Je suis en mesure d'appeler des fonctions au sein de la DLL en utilisant ce code:
[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr VmHidScan();
Maintenant je dois appeler une fonction qui requres un pointeur de type personnalisé. Docs pour la DLL layout de la fonction comme ceci:
hid_get_info(int n,PDEV_INFO *pdi)
Je ne sais pas comment utiliser ce pointeur personnalisé. Est-ce que défini dans la DLL? Si oui, comment peut l'utiliser du projet C #? Sinon dois-je inclure le fichier d'en-tête en C #? Merci d'avance pour votre aide.
La solution
Étant donné le préfixe « P », il semble que la déclaration réelle est
hid_get_info(int n, DEV_INFO **pdi)
où dev_info est une structure. Vous aurez besoin de trouver la déclaration de cette structure et l'ajouter à votre code C # avec l'attribut [StructLayout]. Vous auriez alors déclarer la fonction comme ceci dans votre code C #:
[DllImport("blah.dll")]
private static extern something hid_get_info(int n, out IntPtr pdi);
et utiliser pour obtenir la valeur de structure Marshal.PtrToStructure (). Nous espérons que vous n'avez pas à libérer la structure, vous seriez vissable.
Une seconde interprétation est que « pid » retourne un tableau de pointeurs vers des structures dev_info. Un peu probable étant donné l'argument « n », ce qui pourrait bien signifier le nombre d'éléments du tableau que vous passez à remplir par la fonction. Dans ce cas, passer un IntPtr [] et réglez « n » à sa longueur.
Autres conseils
Vous devez créer un struct
en C # qui reflète le C ++ PDEV_INFO
struct
en C ++.
Vous devez appliquer [StructLayout(LayoutKind.Sequential)]
à la struct puis copiez les champs de la struct C ++ (regardez le fichier d'en-tête) dans l'ordre.
Vous pouvez alors écrire une méthode extern
qui prend la struct
comme paramètre ref
.
Je suppose en toute sécurité PDEV_INFO*
est un DEV_INFO**
.
Utilisez cette option C #:
class DEV_INFO
{
// fields go here
}
static class NativeMethods
{
[DllImport...]
public static extern int hid_get_info(int n, ref DEV_INFO pdi);
}