나는이 함께 할 수 있지만, 무엇을 정말 확실하지 기본적으로 내가 데스크탑 회계 시스템을 통해와 정보를 교환하는 시스템을 개발 한 사람이포스 과정은 COM 개체가 소멸 될 때 닫습니다
을 도울 수있을 것으로 기대 COM 인터페이스
나는 내가
Dim myObject as New AccountingLibraryType
이 그때 나에게 가시에 액세스 할 수 있습니다 새 인스턴스를 만들 내 코드에 다음 내 .NET 프로젝트에 COM 라이브러리에 대한 프로젝트 참조를 추가 한 적이 무엇 프로퍼티, 프로 시저 및 함수 등
myObject.Login("Login details go here")
내 개체의 인스턴스에서 작업을 완료 할 때
내 문제가 시작 모두가 잘 작동이 부분. 아무리 내가 뭘 나는 자주 나는 내가 심지어 프로세스가 계속 내 윈도우 작업 관리자에서 실행 남아있는 모든 후
myObject.Logout 'As per Accounting software developers, should close process
GC.Collect()
Marshel.ReleaseComObject(myObject) ' Also tried Marshal.FinalReleaseComObject(myObject)
myObject = Nothing
다음을 수행 내 객체를 폐기있을 때 프로세스가 여전히
을 실행으로 끝날 없습니다.ProgID로 프로세스를 조사했지만 불행히도 일반적으로 최종 사용자가 일반적으로 회계 소프트웨어에서 직접 작업 할 것이므로 올바른 프로세스를 얻을 수있는 방법이 없습니다.
내가 볼 수있는 한, com 개체에는 프로세스를 식별 할 수있는 것이 없습니다. 내가 속성 컬렉션을 얻을 수 있지만, 다시
Dim attributes As AttributeCollection
attributes = TypeDescriptor.GetAttributes(GetType(AccountingLibraryType))
그래서 먼저 올바른 프로세스에 그에서 얻을 어쨌든 표시되지 않습니다 발견, 나는 과정을 보장하기 위해 일을 할 수있는 뭔가가 완전히 거기인가 내가 끝낼 때 폐업했다.
두 번째로, 프로세스의 핸들을 얻을 수있는 객체 인스턴스를 만들 수 있지만 더 좋은 방법은 보이는 속성과 메소드에 대한 액세스 권한을 유지하는 것이다. 나는 프로세스와 StartInfo를 살펴 봤지만 필요한 메소드 등을 얻는 방법을 실제로 볼 수 없었다.
회계 소프트웨어의 경우 내부 가비지 수집에 문제가 있다고 생각된다. 나는 이것에 대해 여러 번 이야기했지만, 그것에 관해서는 아무 것도하지 않습니다. - 그래서 그들을 파괴하는 경우도 있습니다
Marshal.FinalReleaseComObject(myObject)
myObject = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
가 파괴 될 필요가 자식
COM
개체가 없는지 확인하기 :
여기
내가 말한 경우라면, IDisposable을 구현하는 내 자신의 래퍼 클래스를 작성해야합니다. Sub Dispose에서 개체 참조를 정리합니다. – Hursey