.NET의 메모리에서 ArcObject를 해제하는 규칙은 무엇입니까?


답변:


18

가장 주목할만한 것은, 커서 로 작업을 마치면 항상 명시 적으로 커서를 놓는 것입니다. 또한 예를 들어 데이터베이스 액세스를 암시하는 몇 가지 열거 개체 해제 IEnumRelationship 당신이에서 얻을 IRelationshipClass.GetRelationshipsForObject을 .

또한 수명이 짧은 (특히 타이트한 루프에서) 많은 COM 인스턴스를 만들 때는 명시 적으로 해제하는 것이 좋습니다.

개별 기능 (행) 참조를 해제하는 것이 좋습니다 시나리오도 있습니다. 예를 들어, 새로운 지오 데이터베이스 버전, 데이터 편집, 조정 및 게시를 생성 한 경우 릴리스되지 않은 행이있을 수 있으므로 이후 버전을 삭제하려는 시도가 실패 할 수 있으며, 이로 인해 삭제하려는 버전 (작업 영역)이 계속 유지됩니다. 그러나 대부분 이러한 시나리오는 드물며 일상적인 ArcObjects 개발에서이를 설명 할 필요는 없습니다. 불필요한 정리만으로 코드가 복잡해져 유지 관리가 쉽지 않습니다.

.NET 랩퍼를 해제하지 말아야 할 때도 언급해야 합니다. 다른 관리 코드에서 사용중인 ArcObject의 RCW를 명시 적으로 해제 하지 마십시오 . 이것의 한 가지 예-ArcMap에있을 때 IMap을 해제하지 마십시오. 일반적으로 생성하지 않은 ArcObject를 해제하지 마십시오.



2

항상 파괴하십시오 :

  • 커서
  • IEnums

다른 곳에서 사용중인 것을 파괴하지 않도록주의하십시오.

오늘 저는 Kirk가 참여한 ESRI 웹 사이트에서 흥미로운 토론을 읽었습니다. ReleaseComObject 메소드 및 FinalReleaseComObject (또는 이와 유사한 것) 사용과 같은 다른 흥미로운 의견이있었습니다. 죄송합니다. 현재 링크가 없습니다.

일부는 IRows 릴리스를 제안했지만 GC에서 직접 처리하는 것이 더 쉽다는 데 동의했습니다.

나는 어떤 IGeometry도 해제하지 않습니다. 아무도 그것을 시도?


1

ESRI.ArcGIS.ADF.ComReleaser를 사용하겠습니다. 즉, 결정적인 릴리스 패턴을 사용하는 아크 객체는 정확히 확실하지 않지만 가장 중요하기 때문에 주로 IServerContext 객체에 부착합니다.

using (ComReleaser comReleaser = new ComReleaser())
{

}

2011 esri 개발자 서밋에서 얻을 수있는 정보는 다음과 같습니다.

내가 기억하는 큰 목록은 싱글 톤 객체 (도움말의 두 가지 주제)에 대한 것입니다.

이것은 .NET "COM 참조 릴리스"주제에서 ArcObject를 사용하기위한 우수 사례의 링크입니다. http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Releasing_COM_references/0001000004tm000000/

다음은 지오 데이터베이스 블로그에서 개체 목록이 포함 된 4 개의 토론에 대한 게시물입니다. http://blogs.esri.com/dev/blogs/geodatabase/archive/2010/05/18/what_2700_s‑up‑with ‑comreleaser_3f00_.aspx

(마지막으로 URL이 작동하지 않을 경우 도움이되는 링크가있는 블로그 게시물) http://blogs.esri.com/dev/blogs/geodatabase/archive/2008/12/18/using‑the‑comreleaser‑to-manage 평생 커서 —in..net.aspx


IServerContext로 작업 할 때 ComReleaser처럼 .NET RCW를 릴리스하는 것보다 더 중요한 것은 ReleaseContext를 호출하는 것입니다. 가장 좋은 방법은 IDisposable을 구현하는 .NET 클래스에서 컨텍스트를 감싸는 것입니다 (그리고 파이널 라이저 구현을 포함한 표준 처리 패턴을 따르는 것)
Petr Krebs

@Petr yes releaseContext는 거대하고 간과하지는 않았지만 다른 사람들을 위해 글을 써 주셔서 감사합니다.
Steve

2
ComReleaser는 32 비트 어셈블리의 일부이므로 64 비트 프로세스 (예 : ArcGIS Server)에서 ComReleaser를 실행할 수 없습니다. 나는 공기업을 쓰고 있었고 화상을 입었다.
bcollins

서버 릴리스를위한 다른 옵션이 있습니까?
VBAHole

@VBAHole 내가 알지 못합니다. 10.5.1 arcobjects에서도.
Steve

0

IWorkspace 객체를 잊지 마십시오. 몇 년 전 ESRI dev Summit에서 질문을했고 ESRI의 대답은 ICursor와 IWorkspace 객체였습니다.


작업 공간 팩토리 싱글 톤에 의해 캐시되므로 작업 공간을 해제 할 필요가 없습니다.
Preston

0

SOI에서 커서와 같은 서버 객체로 작업 할 때 규칙이 다른가? ComReleaser를 사용하려고하는데 SOI 코드의 메소드 근처에있을 때마다 실패합니다.


기존 질문에 대한 답변으로 질문을 게시하지 마십시오. 기존 질문에 대한 링크와 함께 새 질문으로 게시하십시오.
Bjorn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.