Pergunta

Eu tenho que passar um InParameter do meu aplicativo C # para uma função exportada de uma DLL ++ VC. A função aceita parâmetros 2:

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

fp é em e by é Out parâmetro.

Eu estava pensando em empacotamento usando IntPtr para o FILE* e usando byte para BYTE. Está correto? Se eu escrever o seguinte em C #

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

será que funciona? Eu acho que vai dar um erro para o sinal '&' na declaração de empacotamento. Como faço para passar o parâmetro por referência?

Sua ajuda seria muito apreciada.

Obrigado, Viren

Foi útil?

Solução

Se espera função nativa de referência, você pode organizá-la usando-ref / out. Assim, no seu caso, você poderia usar: out byte by. Eu verifiquei-lo, e ele funciona para mim.

Editar novamente: Ele só veio à minha mente, que conselhos que lhe dei não irá funcionar, como o arquivo é um struct, que você não será capaz de marshall de c # que facilmente. Então riscar esses, você pode usar essa abordagem se quiserem ameaça SafeFileHandle como objeto PUNHO dentro de sua biblioteca não gerenciada. Se você não pode modificar este dll, uma solução é criar próprio wrapper para criar arquivos usando stdio, poderia ficar assim:

  1. Criar biblioteca que expõe a funcionalidade de fopen, fclose etc. Fe. (Em C ++):
    FILE* CreateFile(char* name);
  2. Marhall esta função, neste exemplo, você usaria (c #):
    public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] string name);
  3. Marshall todos os arquivos * parâmetros para IntPtr, e depois é só passar resultado de CreateMyFile função como arquivo *.

Outras dicas

Não, este trabalho não como está escrito.

  1. Onde você está indo para obter um FILE* em um programa C #? A menos que alguma outra função em sua DLL não gerenciada dá-lhe este ponteiro, você está em apuros. BTW eu fortemente recomendo envolvendo este FILE* em um SafeHandle ; em seguida, seu p / invoke assinatura usará um SafeFilePointer em vez de um IntPtr nua.
  2. Quantos bytes que você está empacotamento? Se apenas um, put out byte by na assinatura geridos (sem atributos necessários).
  3. Você não precisa especificar um conjunto de caracteres, desde que você não está empacotamento quaisquer chars ou strings.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top