2011-01-12 4 views
5

У меня есть приложение, которое использует некоторые классы из родной COM-библиотеки DLL в изолированном развертывании.Активация Контекст, потерянный при работе с WinForm?

Упрощенный: Во время выполнения я загружаю dll с файлом манифеста в определенный каталог, не регистрируя его. Затем я создаю контекст активации, указывающий на этот каталог, а затем создаю экземпляры классов из dll. Предположим, что создадим класс A и через некоторое время класс B. В этом потоке все идет хорошо.

Проблема возникла, когда я изменил приложение на WinForm. При нажатии кнопки «1» я создаю контекст активации как и раньше, а затем создаю экземпляр класса A. Это хорошо работает, и поток возвращается к моей WinForm. Однако, когда нажата кнопка «2», я не могу создать класс B. Я получаю исключение, говоря, что класс не может быть найден!

Итак, похоже, что WinForm каким-то образом испортил мой контекст активации. - Почему? Что там происходит? - Есть ли способ вокруг него?

Немногочисленные примечания: - Я попытался создать созданные контекстные создания с использованием sxstrace.exe, однако он зарегистрировал только мое создание Контекста активации. - Я пробовал комментировать Application.EnableVisualStyles(), но это не помогло. - Если я завершу каждый звонок в свою DLL, создав и уничтожаю контекст активации, он работает, но, естественно, я не хочу туда попасть.

ответ

1

CLR не гарантирует сохранение/сохранение Контекста активации Win32 при прохождении управляемый код.

Обходным путем является вызов собственного кода, настройка контекста активации, выполнение необходимых действий, а затем восстановление контекста. Вам, вероятно, понадобится только для загрузки и привязки к объекту, поэтому, как только вы получите IUnknown, вы можете вернуть это.

Martyn