Как получить COM без регистрации, работающий в управляемом / неуправляемом взаимодействии - PullRequest
1 голос
/ 22 марта 2011

У меня есть неуправляемый внутрипроцессный COM-объект C ++ / ATL (в Unmanaged.dll), который я пытаюсь использовать из управляемой C # DLL (Managed.dll).Тем не менее, я хочу, я хочу использовать регистрацию свободного COMУ меня это до следующих шагов:

  • Зарегистрировать объект COM на машине разработки.Внутрипроцессный сервер должен иметь правильно зарегистрированную библиотеку типов.
  • Добавить ссылку на COM-объект в проекте C #, а затем установить для свойств ссылки значение Isolated = True.

Это создает Unmanaged.dll, Managed.dll и Native.Managed.manifest.Открыв манифест, довольно ясно, как система использует его для загрузки COM-объекта без регистрации.

В этом и заключается проблема.У меня есть управляемый EXE (Managed.exe), который динамически загружает Managed.dll для доступа к публичным типам.Под «динамически» я подразумеваю, что он использует Assembly.LoadFrom («Managed.dll»).Когда код внутри Managed.dll пытается создать COM-объект, он получает исключение «класс не зарегистрирован».Похоже, что контекст активации не настроен правильно, когда загружается Managed.dll.

Есть ли способ получить бесплатный COM для регистрации для работы в этом сценарии?

1 Ответ

2 голосов
/ 24 марта 2011

Два дня без ответа, так вот что я придумал за это время ...

Действительно, похоже, что контекст активации настраивается ОС при запуске процесса на основе манифестасвязан с основным EXE.Это означает, что все не связанные с регистрацией COM-связанные элементы должны быть в Main.exe.manifest во время запуска процесса.Это нарушает изоляцию между EXE и DLL.Если DLL-библиотека отвечает за создание COM-объектов, вы не должны ожидать, что в манифесте EXE будет содержаться информация COM без регистрации.Вы могли ожидать, что манифест, связанный с DLL, будет объединен с контекстом активации процесса во время загрузки DLL, но это не так.

Чтобы обойти эту проблему, DLL должна настроить новый контекст активацииперед созданием COM-объекта.Что еще хуже, в настоящее время (начиная с .NET 4.0) нет управляемого способа сделать это.Таким образом, DLL придется вызывать следующие функции Win32:

Я обернул эти вызовы управляемым классом, который вызывает CreateActCtx и ActivationActCtx в конструкторе, а DeativateActCtx и ReleaseActCtx в IDispos:Утилизируйте

.
...