2014-05-21 2 views
1

불행히도 C# 클라이언트에 메모리 누수가있는 네이티브 C++ DLL을 사용해야합니다..메모리 누수가있는 관리되지 않는 DLL의 C# 클라이언트에서 메모리 누수를 피하십시오.

내 C# 응용 프로그램에서이 메모리 누수가 발생하지 않도록하는 좋은 방법이 있는지 알고 싶습니다. 내 이론에 따르면

// Dynamically load DLL file 
NativeMethods.LoadLibrary(...) 

// Do stuffs with the DLL 
... (call compute method) 

// Dynamically unload DLL file 
NativeMethods.FreeLibrary(...) 

// Dynamically load DLL file 
NativeMethods.LoadLibrary(...) 

// Do stuffs with the DLL 
... (call compute method) 

// Dynamically unload DLL file 
NativeMethods.FreeLibrary(...) 

etc... 

감사

+0

"메모리 누수 방지 기능이 잘 작동하지 않습니다."그렇다면 처음에 메모리 누수를 어떻게 감지 할 수 있습니까? 누출 된 증거가 있습니까? 테스트 케이스가 누출되었거나 테스트 케이스 중 하나가 아닙니다. 그렇다면 솔루션을 구현하고 다시 테스트하십시오. 그것은 작동하거나하지 않습니다. – nvoigt

답변

1

:

는 사실, 난 /로드 메모리 점유를 방지하기 위해 여러 번 내 DLL을 언로드하려고하지만 난 그것을 메모리 누수를 방지하기 위해 작동하는지 확실하지 않다 이것은 아무것도 변경하지 않습니다. C#/managed에서 네이티브 프로그램에 DLL을로드하는 것보다 훨씬 큰 차이는 없습니다. DLL은 힙 메모리를 할당하고 DLL이 언로드되는 경우에도 해당 리소스가 프로세스에 속하기 때문에 지속됩니다.

순수하게 관리되는 DLL이있는 경우 상황이 변경됩니다. 그런 다음 응용 프로그램 도메인에로드하고 App-Domain과 함께 alltogether를 처분 할 수 있습니다.

그래서 솔루션이 필요합니까? 어려운 방법은 32 비트 DLL 문제가있는 64 비트 프로세스와 비슷합니다. 별도의 프로세스를 만들고 DLL을로드 한 다음 원격 호출을 수행하십시오. 이것은 성가신 일이지만 vew 만 호출하면, 그만한 가치가있을 수 있습니다.

기타 : DLL 코드를 수정하는 것만은 알지 못합니다. 당신은 C#에서 타사 DLL을 사용하는 경우

0

, 우리는 수동으로

을 사용하여 다음 명령을 사용하여 객체 참조를 제거 할 때 수동으로 제거해야합니다. GC.SuppressFinalize()