Estou usando um objeto COM (MODI) de dentro do meu aplicativo .net. O método que estou chamando lança um System.AccessViolationException, que é interceptado pelo Visual Studio. O estranho é que envolvi minha chamada em uma captura de tentativa, que possui manipuladores para AccessViolationException, COMException e tudo mais, mas quando o Visual Studio (2010) intercepta a AccessViolationException, o depurador interrompe a chamada de método (doc.OCR), e se eu avançar, ela continua na próxima linha, em vez de entrar no bloco de captura. Além disso, se eu executar isso fora do visual studio, meu aplicativo trava. Como posso lidar com essa exceção lançada no objeto COM?
MODI.Document doc = new MODI.Document();
try
{
doc.Create(sFileName);
try
{
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
sText = doc.Images[0].Layout.Text;
}
catch (System.AccessViolationException ex)
{
//MODI seems to get access violations for some reason, but is still able to return the OCR text.
sText = doc.Images[0].Layout.Text;
}
catch (System.Runtime.InteropServices.COMException ex)
{
//if no text exists, the engine throws an exception.
sText = "";
}
catch
{
sText = "";
}
if (sText != null)
{
sText = sText.Trim();
}
}
finally
{
doc.Close(false);
//Cleanup routine, this is how we are able to delete files used by MODI.
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc);
doc = null;
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
Exception
manipulador (temporariamente!) Para interceptar todas as exceções e ver qual é realmente a exceção ?Respostas:
No .NET 4.0, o tempo de execução lida com certas exceções geradas como erros SEH (Windows Structured Error Handling) como indicadores de estado corrompido. Essas exceções de estado corrompidas (CSE) não podem ser capturadas pelo seu código gerenciado padrão. Não vou entrar no porquê ou como está aqui. Leia este artigo sobre CSE's no .NET 4.0 Framework:
http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035
Mas há esperança. Existem algumas maneiras de contornar isso:
Recompile como um assembly .NET 3.5 e execute-o no .NET 4.0.
Adicione uma linha ao arquivo de configuração do seu aplicativo no elemento configuration / runtime:
<legacyCorruptedStateExceptionsPolicy enabled="true|false"/>
Decore os métodos nos quais você deseja capturar essas exceções com o
HandleProcessCorruptedStateExceptions
atributo Consulte http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035 para obter detalhes.EDITAR
Anteriormente, referenciei uma postagem no fórum para obter detalhes adicionais. Porém, como o Microsoft Connect foi desativado, eis os detalhes adicionais, caso você esteja interessado:
De Gaurav Khanna, desenvolvedor da equipe Microsoft CLR
Em seguida, ele passa a referenciar a documentação no HandleProcessCorruptedStateExceptionsAttribute e no artigo acima. Basta dizer que definitivamente vale a pena ler se você está pensando em capturar esses tipos de exceções.
fonte
HandleProcessCorruptedStateExceptions
funciona para mim no .Net 4.5.OR
" das maneiras de fazer isso. :)Adicione o seguinte no arquivo de configuração, e ele será capturado no bloco try catch. Palavra de cautela ... tente evitar essa situação, pois isso significa que algum tipo de violação está acontecendo.
fonte
Compilado a partir das respostas acima, funcionou para mim, seguiu as etapas para obtê-lo.
Etapa 1 - Adicione o seguinte trecho ao arquivo de configuração
Passo 2
Adicionar -
no topo da função que você está amarrando, pegue a exceção
fonte: http://www.gisremotesensing.com/2017/03/catch-exception-attempted-to-read-or.html
fonte
Microsoft: "Exceções de estado do processo corrompidas são exceções que indicam que o estado de um processo foi corrompido. Não recomendamos a execução do aplicativo nesse estado ..... Se você tiver certeza absoluta de que deseja manter o tratamento desses exceções, você deve aplicar o
HandleProcessCorruptedStateExceptionsAttribute
atributo "Microsoft: "Use domínios de aplicativo para isolar tarefas que podem derrubar um processo."
O programa abaixo protegerá seu aplicativo / thread principal de falhas irrecuperáveis sem riscos associados ao uso
HandleProcessCorruptedStateExceptions
e<legacyCorruptedStateExceptionsPolicy>
fonte
Você pode tentar usar AppDomain.UnhandledException e ver se isso permite capturá-lo.
**EDITAR*
Aqui estão mais algumas informações que podem ser úteis (é uma leitura longa).
fonte