Pergunta

É realmente necessário para liberar componentes COM do Office PIA, quando você não precisa mais deles invocando Marshal.ReleaseComObject (..)?

Eu encontrei vários e contraditórios conselhos sobre este tema na web. Na minha opinião, uma vez que Outlook PIA é sempre retornando uma nova referências a suas interfaces como retornando valores de seus métodos, não é necessário para liberá-lo explicitamente. Estou certo?

Foi útil?

Solução

Com o Microsoft Office, em geral, você precisa explicitamente liberar suas referências, o que pode ser feito com segurança em duas etapas:

(1) Primeiro liberar todo o objeto menor para o qual você não segurar uma variável objeto nomeado através de uma chamada para GC.Collect () e, em seguida, GC.WaitForPendingFinalizers (). (Você precisa chamar isso duas vezes, se os objetos envolvidos poderia ter finalizadores, como quando usando o Visual Studio Tools for Office (VSTO).)

(2) Em seguida, solte explicitamente os objetos aos quais você mantenha uma variável chamada através de uma chamada para Marshall.FinalReleaseComObject () em cada objeto.

É isso. : -)

Eu discuti isso com mais detalhes em um post anterior, juntamente com um exemplo de código.

Outras dicas

PIAs são interoperabilidade .NET wrappers. Isto significa que no processo de destruição do objeto (ou descarte - Eu não me lembro) irá lidar automaticamente sua contagem de referência. O truque é que algumas referências não serão liberados até que o coletor de lixo é executado. Depende do que o objeto COM instancia. Por exemplo, um objeto COM que abre cursores de banco de dados irá manter os cursores viva na memória até que a contagem de referência sobre os cursores é liberado. Com o .NET / COM interoperabilidade, as referências não são liberados até que as executa coletor de lixo ou você libera explicitamente a referência usando Marshal.ReleaseComObject (ou FinalReleaseComObject).

Eu, pessoalmente, não trabalhou com o Microsoft Office PIAs, mas na maioria das circunstâncias, você não deve Have para liberar explicitamente as referências. É somente quando seus começos de aplicativos para bloquear outros recursos ou acidente que você deve começar a ser suspeitas sobre pendurado referências.

EDIT: Se você correr em uma situação onde você precisa de limpeza COM / objetos Interop, uso Marshal.FinalReleaseComObject - que leva a referência de contar todo o caminho para zero em vez de apenas decrementing por um - e definir o objecto referência para nulo. Você pode forçar explicitamente a coleta de lixo (GC.Collect) se você realmente quiser ser seguro, mas tenha cuidado de fazer GC muitas vezes como faz invocar um acerto de desempenho perceptível.

Para VS 2010, consulte Marshal.ReleaseComObject é considerado Dangerous .

Existem algumas boas práticas aqui usando um wrapper..worth gerenciado check-out ..

Talvez seja apenas minha superstição, mas eu decidi liberar explicitamente o PIA Escritório via Marshal.ReleaseComObject () porque quando meu aplicativo caiu, as referências ao Excel e Word se permanecerem abertas. Eu não cavar muito fundo na porquê (prazos estúpidas), mas liberá-los como parte do padrão de dispor de minha classe que problema.

Você precisa fazer isso, se você deseja que a instância do aplicativo do Office para sair, conforme descrito em este post .

E é difícil acertar em todos, mas a maioria dos cenários simples.

Há uma simples regra sobre .Net / interoperabilidade - Em caso de dúvida, sempre Release (). : -)

A minha experiência mostra que você tem que, de outra forma (pelo menos Outlook), o aplicativo pode não encerrar em tudo.

Mas isso abre outra lata de vermes, como parece que os RCWs são por processo, assim você pode quebrar algum outro suplemento, que passa a ter uma referência para o mesmo objeto.

Tenho postado uma pergunta relacionada aqui , mas eu ainda não têm resposta clara. Eu vou editar este post uma vez eu sei mais.

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