짧은 이야기 : COM inproc-server (dll)에서 작동하는 C# 응용 프로그램에서"0x80010100 : System call failed "예외가 발생하고 디버그 모드에서도 ContextSwitchDeadlock 예외가 발생합니다.0x80010100 : System call failed "예외, ContextSwitchDeadlock
세부 사항에 이제 더 :.
1) C#을 응용 프로그램은 "아파트"로 등록 된 COM 객체를()를 작성, STA를 초기화 한 후 그 연결 지점 구독에, 및 오브젝트 작업 시작을
2) 어떤 단계에서 COM 개체는 COM 개체의 매우 큰 컬렉션을 인수로 전달하여 많은 이벤트를 생성합니다 같은 아파트에 만들어져 있습니다.
3) C# 측 이벤트 핸들러는 위의 콜렉션을 처리하며 때로는 오브젝트의 일부 메소드를 호출합니다. 어떤 단계에서 후자의 호출은 위의 예외로 실패하기 시작합니다. 는 COM 측면에서
아파트는 그 winproc 다음과 같습니다 숨겨진 창을 사용
typedef std::function<void(void)> Functor;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case AM_FUNCTOR:
{
Functor *f = reinterpret_cast<Functor *>(lParam);
(*f)();
delete f;
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
이벤트는 COM 서버의 다른 부분에서이 창에 게시됩니다
void post(const Functor &func)
{
Functor *f = new Functor(func);
PostMessage(hWind_, AM_FUNCTOR, 0, reinterpret_cast<LPARAM>(f));
}
이벤트는 실제 매개 변수와 바인딩 된 표준 ATL CP 구현이며 다음과 같이 바뀝니다.
pConnection->Invoke(id, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL);
C#에서 5,
핸들러는 다음과 같습니다
private void onEvent(IMyCollection objs)
{
int len = objs.Count; // usually 10000 - 25000
foreach (IMyObj obj in objs)
{
// some of the following calls fail with 0x80010100
int id = obj.id;
string name = obj.name;
// etc...
}
}
================== 그래서
, 위의 문제는 단지 메시지 때문에 발생할 수 아파트의 큐에 배달하려고하는 이벤트가 너무 많이로드되어 있습니까? 또는 이러한 동작을 발생 시키려면 메시지 루프가 완전히 차단되어야합니까?
메시지 대기열에는 "onEvent"호출로 평가되는 2 개의 순차적 이벤트가 있다고 가정합니다. 첫 번째 코드는 C# 관리 코드를 입력합니다.이 코드는 동일한 아파트의 관리되지 않는 코드를 다시 입력하려고 시도합니다. 일반적으로 이것은 허용되며 많은 작업을 수행합니다. 언제 어떤 상황에서 실패 할 수 있습니까?
감사합니다.
이 오류는 가장 일반적으로 COM 서버가 충돌하고 AccessViolation이 발생하여 발생합니다. 서버를 디버그해야합니다. –
@Hans Passant 앞서 언급했듯이 서버는 dll이며 "디버그 비 관리 코드"를 사용하도록 설정하여 C# 응용 프로그램과 함께 디버깅합니다. 그리고 안돼, 아무것도 DLL 내부 충돌. –