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

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

Упрощенный:

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

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

  3. Скажем, создадим класс A и через некоторое время класс B.

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

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

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

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

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

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

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

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

  • Если я оборачиваю каждый вызов моей dll созданием и уничтожением контекста активации, он работает, но, естественно, я не хочу туда идти...


person Erez Cohen    schedule 12.01.2011    source источник


Ответы (1)


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

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

Мартин

person Martyn Lovell    schedule 06.05.2011