2010-03-26 1 views
1

보호 된 메모리 예외가 발생했지만 어떤 호출로 인해 예외가 발생했는지, 그리고 콜백 함수가 이동 한 이유는 무엇인지 어떻게 알 수 있습니까? 관리되지 않는 코드에 대한 모든 호출은 콜백 함수와 동일한 클래스에서 수행되므로 주소가 변경되어서는 안된다고 생각합니까? 아니면 완전히 잘못 되었습니까?어떻게 관리되지 않는 DLL에서 콜백이 보호 된 메모리 예외를 일으키는 지 감지 할 수 있습니까?

답변

2

네이티브 코드를 관리 코드로 다시 호출하려면 콜백 대리자가 필요합니다 (COM interop에 대해 이야기하지 않는 한). 가장 일반적인 오류의 원인은 마지막 콜백이 발생하기 전에 콜백 대리자가 가비지 수집된다는 것입니다. 콜백 대상이 정의 된 클래스는 중요하지 않지만 대리자를 활성 상태로 유지하는 것은 중요합니다.

메서드 이름을 지정하고 C# 컴파일러에서 임시 대리자를 만들 수있는 기능을 사용하면이 오류가 훨씬 더 흔하게 발생합니다. 나는. 대신

SetCallback(MyCallbackMethod); // No good since you can't keep reference to delegate 

의이

_callback = MyCallbackMethod; // Create delegate explicitly and store reference at class level 
SetCallback(_callback); 

당신은 당신이 버그의 유형을 찾을 수 있도록 "managed debug assistants"를 활성화 할 수 있습니다 않습니다.

관련 문제