Supponiamo che esista un metodo C++ int NativeMethod(double, double *)
in un file Native.dll. Il mio primo tentativo di chiamare questo metodo dal codice gestito è stato (supponendo non ho bisogno di specificare il punto di ingresso)Uso corretto di DllImport
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);
quindi di utilizzare la DLL che ho fatto
IntPtr x = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
NativeMethod(2.0, x);
//do stuff with x
Marshal.FreeHGlobal(x); //crash
vorrei capire perché questo si blocca qui. La mia prima ipotesi è che si tratta di un problema di heap dovuto al fatto che la DLL e la mia applicazione potrebbero utilizzare un CRT diverso. Ma se fosse il caso, perché invece la chiamata al blocco NativeMethod non sarebbe? Il metodo ha restituito una x che potrei estrarre con successo il doppio da.
io sono in grado di ottenere l'importazione di lavorare passando il doppio per riferimento
[DllImport("Native.dll")]
private static extern int NativeMethod(double inD, IntPtr outD);
Perché il crollo FreeHGlobal nel primo tentativo, e qual è il metodo consigliato per passare puntatori a metodi nativi? La parola chiave out potrebbe funzionare bene questa situazione, ma cosa succede se ho bisogno di maresciallo una stringa? Io non penso di poter andare in giro Alloch e Freeh ...
Qual è il messaggio di errore che ti dà? – Amy
Ovviamente, questo dovrebbe essere typeof (double). Ma penso che SizeOf (typeof (InpPtr)) sia sempre> = SizeOf (typeof (double)), quindi potrebbe funzionare in qualche modo. Interessante, che cos'è la parte "fai roba con x"? –