2012-08-20 1 views
3

dll을 생성하는 WinForms 컨트롤 프로젝트가 하나 있습니다. 첫 번째 프로젝트를 사용하는 두 번째 dll 프로젝트 (또한 winforms 컨트롤)가 있습니다. 두 번째 프로젝트를 사용하는 세 번째 winforms 프로젝트 (이번에는 양식)가 있습니다. 그래서 [제 3 프로젝트] <> ------> [두 번째 프로젝트] <> [첫 번째 프로젝트]정적 이벤트가 다른 dll에서 구독되지 않습니다.

첫 번째 프로젝트는 정적 이벤트를 노출합니다. 세 번째 프로젝트에서 해당 이벤트에 가입하려고합니다. 이벤트는 + = 호출 후에 null (구독이 아님)으로 유지됩니다.

가입하지 않는 이유는 무엇입니까? WinForms 컨트롤 자체 스레드가 있기 때문에 때문입니까? FirstProject 사용자 정의 컨트롤은 특정 시점에서 즉시 작성됩니다. 하지만

프로젝트, 정적 다른 작업을하지 않고, 제대로 작동 할 것으로 예상됩니다 1

namespace Something 
{ 
    public partial class FirstClass : UserControl 
    { 
    ... 
    public delegate void EventHandler(); 
    public static event EventHandler MyEvent; 
    ... 
    } 
} 

프로젝트 3

namespace Another 
{ 
    public partial class ThirdClass : Form 
    { 
    ... 
    public ThirdClass() 
    { 
     .... 
     Something.FirstClass.MyEvent += new Something.FirstClass.EventHandler(MyHandler); 
    } 
    public void MyHandler() 
    { 
    } 
    ... 
    } 
} 

나는 기본 사항에 작은 응용 프로그램을 만들었습니다 편집 세 가지 프로젝트와 정적 이벤트를 가져옵니다. 그리고 그것은 작동합니다. 그러므로 뭔가 다른 일이 일어나고 있습니다.

EDIT 2 이벤트가있는 첫 번째 프로젝트가 들어있는 dll이 두 번로드되고있었습니다. 별칭을 추가했지만 도움이되지 않았습니다. 그리고 여전히 + = 이벤트가 여전히 null 일 때를 설명하지 않습니다.

EDIT 3 추가/제거 접근 자 쌍을 갖도록 이벤트를 변환했습니다. 그것은 추가에 들어갑니다. Handler 메서드는 값을 올바르게 가져오고 (따라서 null도 없음) 일단 외부로 나가면 다시 null입니다.

+1

프로젝트 3의 ctor가 실행 중입니까? 등록 코드에 중단 점을 넣고 전혀 실행되었는지 확인하십시오. 당신이 왜 그것이 효과가 없어야하는지에 대한 정보에서 아무 이유도 찾아 볼 수 없습니다. –

+0

작동하지 않습니다. 거기에 중단 점을 넣었습니다. 그것이 내가 +가 작동하지 않는다는 것을 발견 한 것입니다. –

답변

0

이유는 내 EDIT 2입니다. 왜냐하면 정적 이벤트이기 때문에 dll (두 개의 다른 경로)을 두 번로드하면 두 개의 다른 정적 이벤트 (또는 두 개의 다른 핸들러)가 생성됩니다. 내 EDIT 3은 이벤트가 구독되었음을 분명히 보여주었습니다.

일단 세 번째 프로젝트 (정적 이벤트를 구독하는 프로젝트)가 이벤트를 만드는 프로젝트와 동일한 위치에서 dll을로드하도록 강제하면 (나는 GAC를 사용하고 싶지 않습니다.) 모두 작동합니다.

0

정적 이벤트는 정상적으로 작동합니다. 코드를 디버그하여 이벤트 등록이 호출되고 이벤트 자체가 예상대로 실행되는지 확인하십시오. 이벤트는 스레드를 신경 쓰지 않습니다. 어느 쪽이든 등록을 수락합니다. 그러나 스레드가 UI 스레드 외의 스레드에서 편집하려고하면 예외가 발생합니다.

관련 문제