2011-01-12 4 views
5

격리 된 배포에서 기본 COM DLL의 일부 클래스를 사용하는 응용 프로그램이 있습니다.WinForm을 사용할 때 활성화 컨텍스트가 손실됩니까?

간체 : 런타임에 매니페스트 파일이있는 dll을 등록하지 않고 특정 디렉토리에 다운로드합니다. 그런 다음 해당 디렉토리를 가리키는 활성화 컨텍스트를 만든 다음 나중에 dll에서 클래스의 인스턴스를 만듭니다. 클래스 A를 생성하고 잠시 후에 클래스 B를 생성한다고 가정 해 보겠습니다. 이 흐름에서는 모두 잘 진행됩니다.

응용 프로그램을 WinForm으로 변경했을 때 문제가 발생했습니다. "버튼 1"을 누르면 이전과 같이 활성화 컨텍스트를 만든 다음 클래스 A의 인스턴스를 만듭니다. 이 작업은 성공적이며 WinForm으로 돌아갑니다. "버튼 2"를 누르면 클래스 B를 만들지 못합니다. 클래스를 찾을 수 없다는 예외가 발생합니다!

그래서 WinForm이 내 Activation 컨텍스트를 어지럽히는 것처럼 보입니다. - 그 이유는 무엇입니까? 거기서 무슨 일이 일어나고있는거야? - 주위에 방법이 있습니까?

몇 가지 참고 사항 : - Activation Context를 사용하여 sxstrace.exe를 사용해 보았지만 Activation Context 생성 만 기록했습니다. - Application.EnableVisualStyles()를 주석 처리했지만 도움이되지 않았습니다. - DLL을 호출 할 때 각 호출을 만들고 활성화 컨텍스트를 제거하면 작동하지만 자연스럽게 거기에 가고 싶지 않습니다 ..

답변

1

CLR은 통과 할 때 Win32 활성화 컨텍스트를 유지/유지할 것을 보장하지 않습니다 관리되는 코드.

해결 방법은 네이티브 코드를 호출하고 거기에서 활성화 컨텍스트를 설정하고 필요한 작업을 수행 한 다음 컨텍스트를 복원하는 것입니다. 객체 로딩과 바인딩을 위해서만 필요할 것입니다. 그래서 IUnknown을 가지고 나면 그것을 반환 할 수 있습니다.

Martyn