Pergunta

Eu tenho a maior parte incorporado com sucesso firefox / xulrunner em nosso aplicativo c #, mas não é sem problemas. Uma vez em um grande quando um AccessViolationException será lançada que eu acredito que é causada pela GC mover um objeto gerenciado na memória e as tentativas XPCOM não gerenciados para usá-lo depois de ter sido movido. Por exemplo, eu criei um manipulador de protocolo para um protocolo personalizado que implementa algumas interfaces que as chamadas firefox / xulrunner em cima. Depois de fazer isso, o AccessViolationException do tornou-se muito mais predominante. Olhei para GCHandle.Alloc (objeto, GCHandleType.Pinned) como uma possível solução, mas não conseguiu encontrar informação suficiente sobre como escrever um marshaller personalizado para fazer a minha classe que implementou as interfaces "blittable". Então, alguém tem alguma idéia sobre como lidar com este problema ou como traduzir a minha classe em um "blittable"? Também a sua quase impossível de rastrear quais partes da interoperabilidade estão causando o AccessViolationException. Ugh: - (

Obrigado por qualquer visão!

Foi útil?

Solução

Eu acredito que eu tenho uma resposta para isso através dos meios de outra pergunta que fiz "faz GetComInterfaceForObject fixar o objeto? ". Basicamente o que eu acredito é o AccessViolationExceptions onde ser gerados por um objeto vai fora do escopo no lado .net, se o meu entendimento está correto referência não gerenciado não vai manter um objeto gerenciado vivo. Assim, qualquer objeto gerenciado que eu crio que precisa ser em torno de um longo período de tempo para que o código não gerenciado pode invocá-lo, agora é armazenado em qualquer um campo ou uma lista. Também do lado de um objeto "blittable", eu não encontrei uma maneira de fixar uma classe, mas eu consegui descobrir como fixar um struct que implementou uma interface. A interface foi uma interface de interoperabilidade que MarshalAs tinha os atributos definidos, o que permitiu a conversão de código não gerido, portanto, aparentemente, permitindo que o objecto a ser fixado. Não sei se isso é possível com a implementação de classe como eu ainda recebeu erros apesar de ter sido implementado em exatamente da mesma maneira como a estrutura.

: -)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top