Empacotamento de C # para C ++
-
06-07-2019 - |
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
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:
- Criar biblioteca que expõe a funcionalidade de fopen, fclose etc. Fe. (Em C ++):
FILE* CreateFile(char* name);
- Marhall esta função, neste exemplo, você usaria (c #):
public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] string name);
- 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.
- 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 esteFILE*
em umSafeHandle
; em seguida, seu p / invoke assinatura usará umSafeFilePointer
em vez de umIntPtr
nua. - Quantos bytes que você está empacotamento? Se apenas um, put
out byte by
na assinatura geridos (sem atributos necessários). - Você não precisa especificar um conjunto de caracteres, desde que você não está empacotamento quaisquer
char
s oustring
s.