Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Antes do .NET estrutura versão 2.0, todos os identificadores do sistema operacional podem ser encapsulados somente no IntPtr objeto wrapper gerenciado. Enquanto essa foi uma maneira conveniente de interoperar com código nativo, poderiam vazamento alças por exceções assíncrono, sistema autônomo um segmento anulando inesperadamente ou um estouro de pilha.Essas exceções assíncrono são um obstáculo para limpeza de recursos de sistema operacional e eles podem ocorrer praticamente em qualquer lugar no seu programa.Eles estão sujeitos a ocorrer em aplicativos que usam um host que esteja executando o código gerenciado, sistema autônomo o Microsoft SQL servidor.
Em algumas circunstâncias, os objetos finalizáveis poderiam ser recuperados pela lixo coleção ao executar um método em uma plataforma telefonar de invocação.Se um finalizador liberada o identificador passado para que invocação de plataforma telefonar, ele pode levar a manipular corrupção.O identificador também poderia reclamado enquanto seu método é bloqueado durante um invocação de plataforma chamar, sistema autônomo ao ler um arquivo.
Mais crítica, como Windows agressivamente recicla alças, uma alça poderia ser reciclados e apontar para outro recurso que possa conter dados confidenciais.Isso é conhecido sistema autônomo um ataque de reciclagem e pode possivelmente danificar dados e ser uma ameaça à segurança.
Iniciando com o .NET estrutura 2.0, a SafeHandle classe simplifica a vários desses problemas de tempo de vida do objeto e está integrado com invocação de plataforma assim que os recursos de sistema operacional não são vazados. The 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 quando telefonar de invocação de plataforma é considerado em estado corrompido.
Porque SafeHandle herda do CriticalFinalizerObject, são chamados de todos os finalizadores não críticos antes de qualquer um dos finalizadores críticos. Os finalizadores são chamados de objetos que não estão mais em tempo real durante a etapa de coleta de lixo mesmo.Por exemplo, um FileStream objeto pode executar um finalizador normal para afastar os dados armazenados em buffer existentes sem o risco da alça que está sendo perdido ou reciclada. Essa ordem muito fraca entre os finalizadores críticos e não se destina para uso geral.Ele existe principalmente para auxiliar na migração de bibliotecas existentes, permitindo que essas bibliotecas usar SafeHandle sem alterar sua semântica. Além disso, o finalizador crítico e qualquer coisa chama, sistema autônomo a 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 no gráfico de telefonar do finalizador.
Começar com o .NET estrutura versão 2.0, invocação de plataforma operações automaticamente incrementar a contagem de referência de identificadores encapsulado por um SafeHandle e decrementá-los após a conclusão. Isso garante que a alça de não ser reciclada ou fechou inesperadamente.
Você pode especificar a propriedade de identificador subjacente durante a construção SafeHandle objetos. Essa opção controla se o SafeHandle objeto lançara o identificador depois que o objeto foi descartado. Isso é útil para identificadores com requisitos específicos de tempo de vida ou para o consumo de um identificador cuja vida útil é controlada por outra pessoa.
Classes de identificador seguro
The Microsoft.Win32.SafeHandles namespace contém classes derivadas de SafeHandle para fornecer funcionalidade com suporte para identificadores de arquivo e sistema operacional. A tabela a seguir resume as classes SafeHandle do .NET estrutura.
Classe |
Descrição |
|---|---|
Disposição um identificador para invocação de plataforma operações que garante a finalização sem interrupção.Essa classe deve ser herdada. |
|
Fornece acesso aos identificadores de arquivo não gerenciado. |
|
Fornece acesso aos identificadores de espera não gerenciado. |
|
|
e |
Permite que você criar uma classe do identificador de segurança personalizado. |