Compartilhar via


System.Runtime.InteropServices.COMException classe

Este artigo fornece observações complementares à documentação de referência para essa API.

A COMException classe é a exceção que é lançada quando um HRESULT não reconhecido é retornado de uma chamada de método COM.

O Common Language Runtime transforma HRESULTs conhecidos em exceções .NET, permitindo que objetos COM retornem informações de erro significativas para clientes gerenciados. O mapeamento HRESULT-to-exception também funciona na outra direção, retornando HRESULTs específicos para clientes não gerenciados. Para obter detalhes de mapeamento, consulte Como mapear HRESULTs e exceções.

Quando o tempo de execução encontra um HRESULT desconhecido (um HRESULT que não tem uma exceção específica correspondente), ele lança uma instância da COMException classe. Essa exceção para todos os fins expõe os mesmos membros que qualquer exceção e herda uma propriedade pública ErrorCode que contém o HRESULT retornado pelo chamado. Se uma mensagem de erro estiver disponível para o tempo de execução (obtida da interface IErrorInfo ou o objeto no Visual Basic ou, em alguns casos, do sistema operacional), a mensagem será retornada para o Err chamador. No entanto, se o desenvolvedor do componente COM não incluir uma mensagem de erro, o runtime retornará o HRESULT de oito dígitos no lugar de uma cadeia de caracteres de mensagem. Ter um HRESULT permite que o chamador determine a causa da exceção genérica.

Manipular uma exceção COMException

A seguir estão algumas considerações para solucionar problemas de uma COMException exceção.

Verifique a propriedade Quando o tempo de execução encontra um HRESULT desconhecido e lança uma exceção, a propriedade inclui a ErrorCodeErrorCode mensagem de erro ou, se uma COMException mensagem de erro não estiver disponível, o valor HRESULT de oito dígitos. A mensagem de erro ou o valor HRESULT pode ajudá-lo a determinar a causa da exceção.

Para obter uma lista de valores HRESULT, consulte Valores HRESULT comuns.

Ao passar argumentos vinculados tardiamente para métodos de objetos do Microsoft Office, uma COMException exceção pode ser lançada quando os objetos são objetos COM. A associação tardia presume que essas chamadas de método envolvem um parâmetro ByRef e que a propriedade passada por você tem um acessador set. Se a propriedade não funcionar, o .NET gerará uma MissingMethodException exceção (com um CORE_E_MISSINGMETHOD HRESULT ). Para contornar esse comportamento, use objetos de associação antecipada ou passe uma variável em vez de uma propriedade do objeto.

COM é usado para se comunicar entre o Visual Studio e o processo de hospedagem. Como ele é usado antes da execução do código, uma chamada para CoInitializeSecurity faz com que essa exceção seja lançada. Em alguns casos, executar o Visual Studio como administrador pode resolver o problema. Você também pode desativar o processo de hospedagem.

Lançar uma exceção COMException

Embora você possa usar a COMException classe para retornar HRESULTs específicos para clientes não gerenciados, lançar uma exceção .NET específica é melhor do que usar uma exceção genérica. Considere que clientes gerenciados, bem como clientes não gerenciados, podem usar seu objeto .NET, e lançar um HRESULT para um chamador gerenciado é menos compreensível do que lançar uma exceção.