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

¿Fue útil?

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í:

  1. Cree una biblioteca que exponga la funcionalidad de fopen, fclose, etc. Fe. (en c ++):
    FILE* CreateFile(char* name);
  2. Marhall esta función, en este ejemplo usaría (c #):
    public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] string name);
  3. 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.

  1. ¿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 este FILE * en un SafeHandle ; entonces su firma p / invoke usará un SafeFilePointer en lugar de un simple IntPtr .
  2. ¿Cuántos bytes estás ordenando? Si es solo uno, coloque byte by en la firma administrada (no se requieren atributos).
  3. No necesita especificar un conjunto de caracteres, ya que no está ordenando ningún char s o string s.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top