Der Aufruf einen benutzerdefinierten Typs aus einer DLL in C ++ geschrieben von c #
-
18-09-2019 - |
Frage
Ich verwende eine DLL in C ++ geschrieben in meiner C # -Projekt. Ich konnte Funktionen innerhalb der DLL nennen diesen Code verwenden:
[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr VmHidScan();
Jetzt brauche ich eine Funktion aufrufen, die einen benutzerdefinierten Typ Zeiger requres. Die Docs für die DLL-Layout die Funktion wie folgt aus:
hid_get_info(int n,PDEV_INFO *pdi)
Ich weiß nicht, wie sich diese benutzerdefinierten Zeiger verwenden. Ist das in der DLL definiert? Wenn ja, wie kann es von C # Projekt verwenden? Wenn nicht muss ich die Header-Datei in c # enthalten? Vielen Dank im Voraus für Ihre Hilfe.
Lösung
„P“ Präfix gegeben, es sieht aus wie die wirkliche Erklärung
hid_get_info(int n, DEV_INFO **pdi)
wo DEV_INFO ist eine Struktur. Sie müssen die Erklärung dieser Struktur finden und es zu Ihrem C # -Code fügen mit dem [StructLayout] Attribute. Sie würden dann die Funktion wie diese in Ihrer C # -Code deklarieren:
[DllImport("blah.dll")]
private static extern something hid_get_info(int n, out IntPtr pdi);
und verwenden Marshal.PtrToStructure (), um die Struktur-Wert zu erhalten. Hoffentlich müssen Sie nicht die Struktur frei, Sie geschraubt werden würde.
Eine zweite Interpretation ist, dass „pid“ gibt einen Array von Zeigern auf Strukturen DEV_INFO. Etwas wahrscheinlich das „n“ Argument, das auch die Anzahl der Elemente in der Anordnung durch die Funktion zu füllen Sie passieren könnte bedeuten. In diesem Fall ein IntPtr [] wählen und „n“ auf seine Länge übergeben.
Andere Tipps
Sie benötigen einen struct
in C # erstellen, die die C ++ PDEV_INFO
struct
in C ++ Spiegel.
Sie sollten [StructLayout(LayoutKind.Sequential)]
auf die Struktur aufzubringen und dann die Felder aus der C ++ struct kopieren (Blick auf die Header-Datei) um.
Sie können dann eine extern
Methode schreiben, die die struct
als ref
Parameter annimmt.
Ich werde sicher davon ausgehen, PDEV_INFO*
ein DEV_INFO**
ist.
Verwenden Sie diese in C #:
class DEV_INFO
{
// fields go here
}
static class NativeMethods
{
[DllImport...]
public static extern int hid_get_info(int n, ref DEV_INFO pdi);
}