Respostas:
Mais notavelmente, sempre libere explicitamente os cursores quando terminar. Também libero alguns objetos de enumeração que implicam acesso ao banco de dados, por exemplo, IEnumRelationship que você obtém de IRelationshipClass.GetRelationshipsForObject .
Além disso, quando você cria muitas instâncias COM de curta duração (especialmente em loops apertados), também é uma boa idéia liberá-las explicitamente.
Também existem cenários em que é aconselhável liberar referências de recursos individuais (linha). Por exemplo, se você criar uma nova versão do geodatabase, editar dados, reconciliar e postar, as tentativas de excluir a versão posteriormente poderão falhar, pois pode haver linhas não lançadas, que, por sua vez, mantêm a referência à versão (espaço de trabalho) que você está tentando excluir. Principalmente, porém, esses cenários são raros e você não precisa dar conta deles no desenvolvimento diário do ArcObjects. Isso apenas tornaria o código confuso com a limpeza externa, tornando-o menos sustentável.
Também é importante dizer quando não liberar wrappers do .NET - nunca libere explicitamente o RCW do ArcObjects, que pode estar em uso por qualquer outro código gerenciado. Um exemplo disso - não libere o IMap quando estiver no ArcMap. Em geral, não tente liberar ArcObjects que você não criou.
Na maior parte, a coleta de lixo do .NET funciona bem. Existem alguns casos no ArcObjects que executam trabalhos importantes em desctrutores e a natureza não determinística dos wrappers .NET pode causar problemas. Este tópico da ajuda aborda os casos principais com os quais se preocupar e como gerenciar as liberações.
Sempre destrua:
Cuidado para não destruir algo que está sendo usado em outro lugar.
Hoje li uma discussão interessante no site da ESRIs da qual Kirk participou. Havia outras opiniões muito interessantes, como o uso do método ReleaseComObject e o FinalReleaseComObject (ou algo parecido). Desculpe, mas não tenho o link agora.
Alguns até sugeriram o lançamento do IRows, mas muitos concordaram que é mais fácil deixar o GC lidar com eles diretamente.
Eu nunca libero nenhum IGeometry. Alguém tentou isso?
Vou usar o ESRI.ArcGIS.ADF.ComReleaser. Dito isto, não tenho certeza de quais objetos de arco usam um padrão de liberação determinístico, mas geralmente o anexo ao objeto IServerContext, pois esse é o mais crucial.
using (ComReleaser comReleaser = new ComReleaser())
{
}
aqui estão algumas informações que eu pude obter na cúpula do esri Developer em 2011.
A grande lista que eu estava lembrando era dos objetos singleton (que são dois tópicos abaixo na ajuda).
Este é o link do tópico Práticas recomendadas para usar o ArcObjects no .NET "Liberando referências COM": http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Releasing_COM_references/0001000004tm000000/
E aqui está uma postagem no Blog do Geodatabase em uma discussão de quatro metros que contém uma lista de objetos: http://blogs.esri.com/dev/blogs/geodatabase/archive/2010/05/18/what_2700_s‑up‑with ‑Comreleaser_3f00_.aspx
(por último, uma postagem de blog com um link para ajudar caso o URL não funcione) http://blogs.esri.com/dev/blogs/geodatabase/archive/2008/12/18/using‑the‑comreleaser‑to‑manage Vida útil dos cursores em .net.aspx
Não se esqueça dos objetos do IWorkspace. Na cúpula da ESRI dev, alguns anos atrás, eu fiz a pergunta, e a resposta da ESRI foram os objetos ICursor e IWorkspace.
as regras são diferentes ao trabalhar com objetos de servidor como um cursor em uma SOI? Estou tentando usar o ComReleaser, mas ele falha sempre que chega perto do método no meu código SOI