Marshaling de C # a C ++
-
06-07-2019 - |
Pregunta
Tengo que pasar un InParameter de mi aplicación C # a una función exportada desde una DLL de VC ++. La función acepta 2 parámetros:
int func_name (FILE* fp, BYTE& by);
fp
está dentro y by
es parámetro Out.
Estaba pensando en organizar usando IntPtr
para el FILE *
y usar byte para BYTE
. ¿Es correcto? Si escribo lo siguiente en C #
[DllImport("name_of_project.dll", CharSet = CharSet.Ansi)] public static extern int func_name(IntPtr FilePointer, [MarshalAs(UnmanagedType.BYTE&)] byte by);
¿funcionará? Creo que dará un error para '& amp;' firmar en la declaración de clasificación. ¿Cómo paso el parámetro de salida por referencia?
Su ayuda sería muy apreciada.
Gracias, Viren
Solución
Si la función nativa espera referencia, puede ordenarla usando ref / out. Entonces, en su situación, podría usar:
out byte by
. Lo he comprobado y funciona para mí.
Editar de nuevo: Se me ocurrió que los consejos que le di no funcionarán, ya que FILE es una estructura, que no podrá ordenar desde C # tan fácilmente. Así que elimínelos, puede usar este enfoque si amenaza a SafeFileHandle como objeto HANDLE dentro de su biblioteca no administrada. Si no puede modificar este dll, una solución es crear su propio contenedor para crear archivos usando stdio, podría verse así:
- Cree una biblioteca que exponga la funcionalidad de fopen, fclose, etc. Fe. (en c ++):
FILE* CreateFile(char* name);
- Marhall esta función, en este ejemplo usaría (c #):
public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] string name);
- Marshall todos los parámetros FILE * a IntPtr, y luego simplemente pasa el resultado de la función
CreateMyFile
como FILE *.
Otros consejos
No, esto no funcionará como está escrito.
- ¿Dónde vas a obtener un
FILE *
en un programa C #? A menos que alguna otra función en su dll no administrado le dé este puntero, está en problemas. Por cierto, recomiendo encapsular esteFILE *
en unSafeHandle
; entonces su firma p / invoke usará unSafeFilePointer
en lugar de un simpleIntPtr
. - ¿Cuántos bytes estás ordenando? Si es solo uno, coloque
byte by
en la firma administrada (no se requieren atributos). - No necesita especificar un conjunto de caracteres, ya que no está ordenando ningún
char
s ostring
s.