Llamar a un tipo personalizado desde un archivo DLL escrito en C ++ desde C #
-
18-09-2019 - |
Pregunta
Estoy usando una DLL escrito en C ++ en mi proyecto de C #. He sido capaz de llamar a las funciones dentro de la DLL utilizando este código:
[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr VmHidScan();
Ahora tengo que llamar a una función que requres un puntero de tipo personalizado. El Docs para la DLL de diseño La función como esta:
hid_get_info(int n,PDEV_INFO *pdi)
No sé cómo utilizar este puntero personalizado. Se define esta en el archivo DLL? Si es así, ¿cómo puede utilizarlo de proyecto de C #? Si no lo necesito incluir el archivo de cabecera en C #? Gracias de antemano por tu ayuda.
Solución
Dada la "P" como prefijo, parece que la declaración es verdadera
hid_get_info(int n, DEV_INFO **pdi)
donde dev_info es una estructura. Tendrá que encontrar la declaración de esta estructura y añadirlo a su código C # con el atributo [StructLayout]. A continuación, tendría declara la función como esto en su código C #:
[DllImport("blah.dll")]
private static extern something hid_get_info(int n, out IntPtr pdi);
y utilizar Marshal.PtrToStructure () para obtener el valor de estructura. Esperemos que no tiene que liberar la estructura, estaría jodido.
A segunda interpretación es que "PID" devuelve una matriz de punteros a dev_info estructuras. Algo probable dado el argumento de la "n", que bien podría significar el número de elementos de la matriz se pasan a ser llenado por la función. En ese caso, pasar una IntPtr [] y ajuste "n" a su longitud.
Otros consejos
Es necesario crear un struct
en C # que refleja el PDEV_INFO
struct
C ++ en C ++.
Usted debe aplicar [StructLayout(LayoutKind.Sequential)]
a la estructura y luego copiar los campos de la estructura C ++ (mira el archivo de cabecera) en orden.
A continuación, puede escribir un método que toma la extern
struct
como parámetro ref
.
Vamos a suponer con seguridad PDEV_INFO*
es un DEV_INFO**
.
Con esto en C #:
class DEV_INFO
{
// fields go here
}
static class NativeMethods
{
[DllImport...]
public static extern int hid_get_info(int n, ref DEV_INFO pdi);
}