Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Se uma estrutura contém tipos simples, ela poderá ser passada para uma função nativa.A rotina nativa precisa obedecer às maneiras como o .NET Compact Framework empacota a estrutura.
Considere um nativo função chamada DoRequest que aceita um parâmetro, um ponteiro para uma estrutura. A estrutura define dois campos:
Uma matriz de caracteres contendo uma sequência ANSI finalizada por NULL.
Um inteiro.
Aqui está a estrutura em C++:
typedef struct
{
char *RequestName,
int Count,
} ALERT_REQUEST;
int DoAlertRequest(ALERT_REQUEST *pRequest);
Sua versão gerenciada correspondente no C# é:
struct AlertRequest
{
String RequestName;
int Count;
}
class AlertClass
{
[DLLImport("ALERT.DLL", EntryPoint="DoAlertRequest",
CharSet=CharacterSet.Ansi)]
public static extern int DoRequest(ref AlertRequest Req);
}
The DllImportAttribute atributo anota os metadados de telefonar do método nativo. Ele notifica o Common linguagem tempo de execução que o DoRequest método está em alerta.dll, que é o nome do método DoAllertRequeste para realizar realizar marshaling strings para ANSI porque todas as strings no código gerenciado são strings de caracteres Unicode.
Uma chamada para este método em C++ no .Net Framework pode se parecer com isso:
AlertRequest Request = new AlertRequest()
Request.RequestName = "beep";
Request.Count = 10;
AlertClass.DoRequest(ref Request);
Quando common linguagem tempo de execução do .NET Framework encontrar o DoRequest, chamá-lo dinamicamente carrega alerta.dll, obtém o endereço de DoAlertRequest, constrói uma versão não gerenciada da estrutura convertendo strings sistema autônomo necessário, empurra um ponteiro para essa estrutura e chamadas DoAlertRequest. Ele apenas não é possível passar um ponteiro para a estrutura porque ele contém um incorporados String objeto.
Dadas essas restrições, o nativo DoRequest método não pode ser chamado diretamente. Em vez disso, uma telefonar intermediária de conversão (thunking) deve embalar DoRequest. O seguinte código C# é um exemplo:
class AlertClass
{
[DllImport("ALERT.DLL", EntryPoint="DoAlertRequestThunk")]
private static extern int DoRequestThunk(String RequestName, int Count);
public static int DoRequest(ref AlertRequst Req)
{
return DoRequestThunk(Req.RequestName, Req.Count);
}
}
AlertClass ainda contém um método com a mesma assinatura sistema autônomo sua contraparte no .NET estrutura. O.NET Compact estrutura DoRequest é uma rotina gerenciada que chama uma particular nativo rotina. Observe que os campos da estrutura foram divididos em argumentos separados na telefonar para a rotina nativa porque o String objeto dentro da estrutura não seria empacotado. A conversão intermediária ajusta a nativoDoRequest. Ele cria uma versão não gerenciada da estrutura e executa a conversão de string, conforme mostrado aqui em C++:
int DoRequestThunk(wchar_t *RequestNameW, int Count)
{
ALERT_REQUEST Req;
int ReturnCode;
// CreateAnsiFromUnicodeString allocates and builds an ANSI
// version of the Unicode string.
Req.RequestName = CreateAnsiFromUnicodeString(RequestNameW);
if (Req.RequestName == NULL)
Return 0;
Req.Count = Count;
// This is the native DoRequest, not to be confused
// with the managed method of the same name.
ReturnCode = DoAlertRequest(&Req);
free(Req.RequestName)
return ReturnCode;
}