Editar: En base a algunas críticas me obliga a reconsiderar estas y otras investigaciones más a fondo. Admito libremente que IntPtr es propenso a errores, creo que puede haber cierto debate sobre lo que significa "más difícil", pero si el marco puede ordenarlo automágicamente y evitar que tengas que anclar cosas, etc., si no usas IntPtr, entonces creo Estoy de acuerdo en que IntPtr sería "más difícil. Me parece después de más investigaciones y pensé que sería más fácil (cuando te fuerzan a P/Invocar y no puedes crear un contenedor C++/CLI) declarar tu estructura (en su caso version) en el código administrado y luego pasarlo a través del parámetro ref.
[StructLayout(LayoutKind.Sequential)]
struct Version
{
// Data members
}
[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern Result Init(ref Version versionInfo);
Mi conjetura sería que usted quiere la versión IntPtr. la diferencia es que IntPtr es una clase que maneja un puntero a memoria, mientras que declarar un parámetro como referencia (palabra clave ref) en una lista de argumentos significa que estás pasando por referencia. En general, cuando paso datos hacia y desde una dll no administrada a través de una llamada P/Invoke, a menos que los datos que se pasen sean de tipo vainilla (int, doble, cadena - con decoración de Mariscal adecuada) paso datos como IntPtr. A continuación, puede Marshal the IntPtr a su declaración gestionada de la estructura no gestionada.
Debe retirar este enlace para más información sobre P/Invoke llamadas: http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
Es lamentable que esté haciendo las cosas de la manera difícil, propensa a errores. Es aún más desafortunado que le enseñe a otras personas a hacerlo también. –
@Ben Me complace aprender una manera más fácil/menos propensa a errores para hacerlo. ¿Tiene un enlace o material de lectura sugerido?No paso mucho tiempo P/Invocando cosas, la mayoría de las veces escribo un wrapper de C++/CLI, pero cuando tengo que usar P/Invoke solo he usado los parámetros ref para cosas como int, string (StringBuilder en casos ven), etc., y luego usó IntPtr para las otras cosas. – pstrjds
C++/CLI para la victoria :) Para aquellas ocasiones en las que no se puede usar (Windows CE, o no se puede estar seguro de que se instalará el tiempo de ejecución de Visual C++), entonces http://pinvoke.net tiene un horrible muchos ejemplos Generalmente, no solo los tipos primitivos como 'int' y' double' se pueden usar con seguridad en firmas p/invoke, sino también tipos definidos por el usuario compuestos por tipos primitivos. Los ejemplos serían 'POINT',' POINTF', 'RECT',' FONTMETRIC', 'BITMAPFILEHEADER', etc. –