C # formatar parâmetros da função Dll externos
-
05-09-2019 - |
Pergunta
Eu ainda tenho que encontrar uma boa referência sobre este tema. Para este exemplo vamos dar algum código C ++ que eu estou tentando porta sobre a C #.
terreno em C ++, temos o seguinte protótipo para uma função de biblioteca externa:
extern "C" DWORD EXPORT FILES_GetMemoryMapping(
PSTR pPathFile,
PWORD Size,
PSTR MapName,
PWORD PacketSize,
PMAPPING pMapping,
PBYTE PagesPerSector);
e ele é usado como tal:
FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)MapName, &PacketSize, pMapping, &PagePerSector);
Agora eu estou tentando porta a primeira linha sobre a C # e aqui é onde eu sou apresentado com nenhum caminho claro.
Este é o que eu tenho até agora:
[DllImport("Files.DLL")]
public static extern uint FILES_GetMemoryMapping(
[MarshalAs(UnmanagedType.LPStr)]
string pPathFile,
out ushort Size,
[MarshalAs(UnmanagedType.LPStr)]
string MapName,
out ushort PacketSize,
IntPtr pMapping,
out byte PagesPerSector);
Agora, a pergunta é: Existe algum bom guia lá fora, que me diz "PSTR pPathFile" deve ser "[MarshalAs (UnmanagedType.LPStr)] string pPathFile" ... Supondo que está correto
Ou, a que um ponteiro para um struct "PMAPPING" se torna um "out IntPtr pMapping" ... assumindo que é correto?
Qualquer ajuda sobre este caras?
Solução
Eu ainda tenho que encontrar uma boa referência sobre este tema
Curiosamente, o site está no momento, mas é um recurso muito bom para mobilizar problemas. Nesse meio tempo, você pode usar arquivo de pinvoke.net de Archive.net em http://web.archive.org/web/20080202041852/http://www.pinvoke.net
Outras dicas
Isso parece certo. A primeira parte da sua pergunta (relativa a MarshalAs) diz ao compilador para converter o C # variável gerenciado em um PSTR. Empacotamento no ambiente .NET refere-se a transferência de dados entre o ambiente gerenciados e não gerenciados. Estes atributos (entre vários outros) dizer ao compilador como fazê-lo especificamente.
O segundo ponto indica que ele vai passar um ponteiro para a estrutura. O tipo IntPtr em .NET é um tipo gerenciado que é usado para segurar uma determinada peça de memória. No mundo da NET, ponteiros (em geral) não existem, embora ainda existem tipos de referência. Ponteiro e gestão de punho é feito para nós pelo CLR. O struct IntPtr é usado quando o empacotamento ponteiros para estruturas de dados ou tipos primitivos
Além de site P / Invoke , Adam Nathan 's NET e cOM: O Guia completo Interoperabilidade é algo que vale a pena acrescentar à sua estante se você tiver mais do que um interesse passageiro em interoperabilidade .NET
.Kev