Контекст активации теряется при работе с WinForm? - PullRequest
5 голосов
/ 13 января 2011

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

Упрощено:

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

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

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

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

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

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 06 мая 2011

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

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

Martyn

...