Контекст активации теряется при работе с WinForm?
У меня есть приложение, которое использует некоторые классы из родной библиотеки COM в изолированном развертывании.
Упрощенная:
Во время выполнения я загружаю dll с файлом манифеста в определенный каталог, не регистрируя его.
Затем я создаю контекст активации, указывающий на этот каталог, а затем создаю экземпляры классов из dll.
Допустим, создание класса А и через некоторое время класса В.
В этом потоке все идет хорошо.
Проблема началась, когда я изменил свое приложение на WinForm. Когда нажата "кнопка 1", я создаю контекст активации, как и раньше, а затем создаю экземпляр класса А. Это работает хорошо, и поток возвращается к моей WinForm. Однако, когда нажата "кнопка 2", я не могу создать класс B. Я получаю исключение, говорящее, что класс не может быть найден!
Похоже, что WinForm каким-то образом портит мой контекст активации.
Это почему? Что там происходит?
Есть ли способ обойти это?
Несколько заметок:
Я попытался выполнить создание контекста активации с помощью sxstrace.exe, однако в нем регистрировалось только создание контекста активации.
Я пытался закомментировать Application.EnableVisualStyles(), но это не помогло.
Если я завершаю каждый вызов в мою DLL с помощью команды "Создать и уничтожить контекст активации", это работает, но, естественно, я не хочу туда идти...
1 ответ
CLR не гарантирует сохранение / сохранение контекста активации Win32 при прохождении через управляемый код.
Обходной путь - вызвать собственный код, установить там контекст активации, сделать то, что вам нужно, а затем восстановить контекст. Вероятно, он нужен только для загрузки и привязки к объекту, поэтому, получив IUnknown, вы можете его вернуть.
Martyn