Partilhar via


Identificadores de segurança e crítica finalização

Antes da.NET Framework versão 2.0, o sistema operacional alças poderiam ser encapsuladas somente na IntPtr gerenciado wrapper objeto. Enquanto esta foi uma maneira conveniente para interoperar com código nativo, alças poderiam ser vazadas por exceções assíncronas, como, por exemplo, um segmento Anulando inesperadamente ou um estouro de pilha. Essas exceções assíncronas são um obstáculo para a limpeza de recursos de sistema operacional e pode ocorrer praticamente em qualquer lugar no seu programa. Eles estão sujeitos a ocorrer em aplicativos que usam um host que está executando o código gerenciado, como, por exemplo, de Microsoft SQL Server.

Em algumas circunstâncias, os objetos finalizáveis poderiam ser recuperados pelo lixo coleção durante a execução de um método em uma plataforma chamada de invocação. Se um finalizador liberada o identificador passado para essa plataforma chamada de invocação, poderia levar a lidar com a corrupção. O identificador também poderia ser recuperado, enquanto o seu método é bloqueado durante uma plataforma de invocar a chamada, como ao ler um arquivo.

Mais criticamente, porque o Windows agressivamente recicla alças, um identificador poderia ser reciclados e apontar para outro recurso que pode conter dados confidenciais. Isso é conhecido como um ataque de reciclagem e pode potencialmente danificar dados e uma ameaça de segurança.

Começando com o.NET Framework 2.0, o SafeHandle classe simplifica a vários desses problemas de tempo de vida do objeto e é integrado com a plataforma chamar assim que os recursos do sistema operacional não são vazados. O SafeHandle classe resolve problemas de tempo de vida do objeto atribuindo e liberando alças sem interrupção. Ele contém um finalizador crítico que garante que o identificador é fechado e é garantido durante AppDomain descarrega, mesmo nos casos em que a chamada de invocação de plataforma será considerado no estado corrompido.

Porque SafeHandle herda de CriticalFinalizerObject, os de finalizadores críticos são chamados antes dos finalizadores críticos. Os finalizadores são chamados de objetos que não estão mais em tempo real durante o passo de coleta de lixo mesmo. Por exemplo, um FileStream objeto pode executar um finalizador normal para afastar os dados em buffer existentes sem o risco da alça seja perdido ou reciclados. Essa ordem muito fraco entre os finalizadores críticos e não se destina a uso geral. Ele existe principalmente para auxiliar na migração das bibliotecas existentes, permitindo que essas bibliotecas para usar SafeHandle sem alterar sua semântica. Além disso, o finalizador crítico e nada ele chama, como o SafeHandle.ReleaseHandle() método, deve estar em uma região de execução restrita. Isso impõe restrições sobre qual código pode ser gravado em um gráfico de chamada do finalizador.

Começando com o.NET Framework versão 2.0, invocação de plataforma operações automaticamente incrementar a contagem de referência das alças encapsulado por um SafeHandle e decremente-los na conclusão. Isso garante que o identificador não irá ser reciclado ou fechou inesperadamente.

Você pode especificar a propriedade do identificador subjacente ao construir SafeHandle objetos. Isso controla se a SafeHandle objeto lançara o identificador depois que o objeto foi descartado. Isso é útil para identificadores com requisitos de tempo de vida peculiar ou para o consumo de um identificador cuja vida útil é controlada por outra pessoa.

Classes de identificador de segurança

O SafeHandle classe na System.Runtime.InteropServices espaço para nome é uma classe abstrata wrapper para identificadores do sistema operacional. É difícil de derivar desta classe. Em vez disso, use as classes derivadas de Microsoft.Win32.SafeHandles espaço para nome que fornecer os identificadores de segurança para o seguinte:

  • Os arquivos e pipes.

  • Modos de exibição de memória.

  • Construções de criptografia.

  • Chaves de registro.

  • Identificadores de espera.

Consulte também

Referência

SafeHandle

CriticalHandle

CriticalFinalizerObject