У нас есть устаревшее приложение с системой плагинов на основе COM. Чтобы зарегистрировать собственный плагин, вызывается DllRegistryServer
, который регистрирует классы COM и добавляет некоторую информацию о реестре для бухгалтерии. Для компонентов .NET у нас есть COM-сервер, написанный на C #, который вызывает RegistrationServices.RegisterAssembly
. Для максимальной совместимости эта C # dll предназначена для .NET v2.0. (Собственный) плагин-регистратор CoCreateInstance()
s на сервере C #.
Поскольку плагины .NET могут предназначаться для .NET v4.0, в конфигурации приложения есть следующее:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- Load 4.0 if available, otherwise 2.0 -->
<!-- http://msdn.microsoft.com/en-us/library/w4atty68.aspx -->
<!-- http://msdn.microsoft.com/en-us/library/w671swch.aspx -->
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />
<supportedRuntime version="v2.0.50727" />
</startup>
</configuration>
Проблема заключается в том, что регистрацию COM необходимо запускать с повышенными правами в Vista или 7, поэтому регистратор подключаемых модулей создается с помощью COM Elevation Moniker, который запускает его вне процедуры в суррогате системы (dllhost.exe
). Это создает проблему, потому что конфигурация приложения не применяется к dllhost.exe
.
Мы хотим решить эту проблему без написания пользовательского суррогата, развертывания двух версий C # COM-сервера, требующего времени выполнения v4.0 или размещения CLR вручную.
Как применить конфигурацию приложения к объекту, созданному COM Elevation Moniker?