Domanda

Devo passare un InParameter dalla mia applicazione C # a una funzione esportata da una DLL VC ++. La funzione accetta 2 parametri:

int func_name (FILE* fp, BYTE& by);

fp è In e per è il parametro Out.

Stavo pensando di eseguire il marshalling usando IntPtr per FILE * e usando byte per BYTE . È corretto? Se scrivo quanto segue in C #

[DllImport("name_of_project.dll", CharSet = CharSet.Ansi)] public static extern int      func_name(IntPtr FilePointer, [MarshalAs(UnmanagedType.BYTE&)] byte by);

funzionerà? Penso che genererà un errore per "& amp;" accedi alla dichiarazione di marshalling. Come faccio a passare il parametro out per riferimento?

Il tuo aiuto sarebbe molto apprezzato.

Grazie, Viren

È stato utile?

Soluzione

Se la funzione nativa prevede riferimenti, è possibile effettuare il marshalling usando ref / out. Quindi, nella tua situazione, potresti usare: out byte by . L'ho controllato e funziona per me.

Modifica di nuovo: mi è venuto in mente che i consigli che ti ho dato non funzioneranno, dato che FILE è una struttura, che non sarai in grado di eseguire il marshalling da c # così facilmente. Quindi gratta quelli, puoi usare questo approccio se minacci SafeFileHandle come oggetto HANDLE nella tua libreria non gestita. Se non riesci a modificare questa dll, una soluzione è quella di creare il proprio wrapper per la creazione di file usando stdio, potrebbe apparire così:

  1. Crea una libreria che espone le funzionalità di fopen, fclose ecc. Fe. (in c ++):
    FILE* CreateFile(char* name);
  2. Marhall questa funzione, in questo esempio useresti (c #):
    public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] string name);
  3. Esegui il marshalling di tutti i parametri FILE * su IntPtr, quindi passa il risultato della funzione CreateMyFile come FILE *.

Altri suggerimenti

No, questo non funzionerà come scritto.

  1. Dove hai intenzione di ottenere un FILE * in un programma C #? A meno che qualche altra funzione nella tua dll non gestita ti dia questo puntatore, sei nei guai. A proposito, consiglio vivamente di racchiudere questo FILE * in un SafeHandle ; quindi la tua firma p / invoke utilizzerà un SafeFilePointer anziché un IntPtr .
  2. Quanti byte stai eseguendo il marshalling? Se solo uno, inserisci out byte by nella firma gestita (nessun attributo richiesto).
  3. Non è necessario specificare un set di caratteri, poiché non si sta effettuando il marshalling di nessun char o string .
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top