2012-08-09 1 views
2

지금 막 외부 DLL을 사용하여 어딘가에 서버에 연결하는 응용 프로그램에서 작업하고 있습니다. 이상하게도 이러한 DLL에 대해 노출 된 메서드는 연결을 허용하지만 연결 해제 또는 닫기는 허용하지 않습니다. 이 라이브러리는 하나의 청크에서 서버에 대한 후속 호출을 많이하지 않는 한 제대로 작동하므로 X만큼의 호출 후에 연결을 끊었다가 다시 연결해야합니다.C#에서 관리되지 않는 객체 삭제

그러나 여기에는 문제가 있습니다. 연결 해제 방법이 없으므로 연결을 끊을 수 없습니다. 그래서 내 질문은, 어떻게 내가 다시 만들 수 있도록이 관리되지 않는 개체를 완전히 죽일 수 있습니까?

+4

네이티브 라이브러리와 같은 사운드가 손상되어 C#에서 처리 할 수있는 것이 없습니다. – CodesInChaos

+3

당신이 제공 한 쓰레기 같은 도서관을 휴지통에 버려두고 다른 사람을 찾으십시오. (전화를 들고 그 사람을 사귀는 사람에게 소리를 지르거나) 자신의 것을 굴립니다. – Alex

+0

슬프게도 꽤 복잡한 시스템을위한 대용량 프레임 워크이므로 재 작성은 옵션이 아닙니다. 예, 라이브러리가 확실히 작동하지 않습니다. :) – Simon

답변

0

내가 찾을 수있는 최선의 해결책은 외부 DLL에 대한 각 호출을 자체 스레드에서 실행하는 것이 었습니다.이 스레드는 결국 스레드가 종료 될 때 종료되었습니다. 이것은 업데이트 된 DLL에 대한 액세스 권한이 없으므로 제대로 작동하는 유일한 해결책이었습니다.

1

C#에서 관리되지 않는 리소스를 사용하는 경우 IDisposable을 구현하고 using 블록으로 만들고 삭제하는 관리되지 않는 리소스를 사용하고 상호 작용하는 클래스가 있어야합니다.

연결을 끊을 수없는 경우 인터페이스와 정확히 어떤지에 따라 관리되지 않는 리소스가 포함 된 변수를 null로 설정하면 일부 항목이 지워집니다. 실제로는 적절한 분리/처리 방법을 사용하지 않고 수행 할 수있는 많은 작업이 없습니다.

+0

질문을 읽으면서 네이티브 라이브러리에 깨진 API가 있기 때문에 "Dispose"라는 의미있는 코드를 작성할 수 없습니다. 그래서 나는 이것이 도움이된다고 생각하지 않는다. – CodesInChaos

+0

@CodesInChaos 실제로, 편집 중이었습니다. –

+0

'using'은 반드시 처분 할 때 메모리가 해제된다는 것을 의미하지는 않습니다. 가비지 컬렉터가 시작될 때 릴리즈 될 것입니다. –

0

서버에 대한 기본 연결을 수동으로 닫을 수 있습니다. 나는 당신이 소비하는 서비스 (HTTP TCP ect?)에 대해 더 알지 못하면서 어떻게하는지에 대해 더 이상 당신을 도울 수 없다. 추적 (wireshark와 같은)을 올려서 전송되는 것을 볼 수 있습니다.

최종선은 소프트웨어가 고장 났지만 말입니다. 공급 업체에 연락 할 수 없습니까?

+0

슬프게도 안돼. 그들은 도서관에서 웹 기반 서비스로 옮겼습니다. 비즈니스는 아직 그로 이동할 수있는 위치에 있지 않습니다 (변환하려는 대규모 사업). – Simon

관련 문제