DLL에 관리되지 않는 코드가 있습니다. 내 호출 (관리되는) 코드가 일부 COM 알림에 연결하는 데 사용하는 몇 가지 메서드를 게시합니다. 비 관리 코드를 관리 코드로 다시 호출하는 대신 숨겨진 Control 파생 개체를 만들고 비 관리 코드가 SendMessage에 대한 매개 변수로 사용하는 handle 속성을 전달했습니다. WinForm은 생성 직후를 제외하고는 메시지를받지 못합니다.
내 컨트롤 파생 클래스 :class InteropWindow : Control
{
//delegate
private Handler m_callback;
//window message
private uint m_message;
public InteropWindow(Handler callback, uint message)
: base()
{
m_callback = callback;
m_message = message;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == m_message)
{
m_callback(new IntPtr((int)m.WParam));
}
base.WndProc(ref m);
}
}
관리되지 않는 코드의 관련 라인 :
SendMessage(m_notify, m_window_message, (WPARAM)pData, 0);
m_window_message & m_message가 (모두 RegisterWindowMessage에서) 동일하며, m_notify == InteropWindow.Handle (pData의 다양하지만 관리 코드에서 불투명 한 핸들로 사용됩니다). 관리되지 않는 코드가 호출되고 있습니다. 이러한 사실은 디버깅을 통해 확인되었습니다.
InteropWindow를 만든 직후 SendMessage에 대한 호출이 성공합니다. 나중에 (초 후에) 메시지는 WndProc에 도착하는 것을 멈추지 만 아무런 오류가 없다.
질문은 내가 여기서 무엇을 잘못하고있는 것입니까?
내가 (어쨌든 아는 한) 라이프 사이클 문제를 배제하고, 아무 소용 HandleRef와 함께 연주했습니다.
두 번째를 편집하십시오.
필자는이 함수를 대신 사용하여 함수 호출을 작성했습니다.이 함수는 자체 위험에 처해 있지만 예상대로 작동합니다. 나는이 문제가 COM 스레딩 문제라고 의심해 왔지만, 그것은 단지 감각에 불과합니다.
핸들이 GC를 통해 유효하다는 것을 확인했습니다. 또는 적어도, 그것이 무효가된다는 표시는 절대적으로 없습니다. Control.HandleDestroyed 호출, 사용시 잘못된 핸들 경고 없음, 첫 번째 예외 예외가 발생하지 않음, 아무 것도 발생하지 않음. –
대신 COM 개체에서 이벤트를 만들 수 있습니까? 나는 관리 측면에서 가입자 였고 훨씬 간단한 솔루션 일 수 있습니다. 그러나 COM/관리되지 않는 쪽에서 이벤트를 만드는 방법을 잘 모르겠습니다. – jonathanpeppers