Контекст активации теряется при работе с WinForm?

У меня есть приложение, которое использует некоторые классы из родной библиотеки COM в изолированном развертывании.

Упрощенная:

  1. Во время выполнения я загружаю dll с файлом манифеста в определенный каталог, не регистрируя его.

  2. Затем я создаю контекст активации, указывающий на этот каталог, а затем создаю экземпляры классов из dll.

  3. Допустим, создание класса А и через некоторое время класса В.

В этом потоке все идет хорошо.

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

Похоже, что WinForm каким-то образом портит мой контекст активации.

  • Это почему? Что там происходит?

  • Есть ли способ обойти это?

Несколько заметок:

  • Я попытался выполнить создание контекста активации с помощью sxstrace.exe, однако в нем регистрировалось только создание контекста активации.

  • Я пытался закомментировать Application.EnableVisualStyles(), но это не помогло.

  • Если я завершаю каждый вызов в мою DLL с помощью команды "Создать и уничтожить контекст активации", это работает, но, естественно, я не хочу туда идти...

1 ответ

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

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

Martyn

Другие вопросы по тегам