Как применить .NET app.config к COM-серверу вне процесса? - PullRequest
4 голосов
/ 27 августа 2011

У нас есть устаревшее приложение с системой плагинов на основе 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?

1 Ответ

1 голос
/ 28 августа 2011

Ссылаясь на это, которое вы, вероятно, также читали: http://blogs.msdn.com/b/clrteam/archive/2010/06/23/in-proc-sxs-and-migration-quick-start.aspx

Смотрите в разделе «Управляемый COM-компонент».Помимо относительно простого взлома обновления реестра (которого я бы лично избегал, поскольку отсеивать рефлексию, чтобы найти все ваши CLSID, вероятно, не круто), я видел этот фрагмент текста:

Если управляемыйCOM-компонент активируется через безрежимный манифест (который нельзя расширить, чтобы он содержал запись SupportedRuntimes), во время выполнения будет выполняться поиск файла конфигурации рядом со сборкой, содержащей видимый класс COM

попробуйте добавить Plugin.dll.config к одному из ваших плагинов и посмотрите, решит ли это проблему?Включенная статья содержит несколько конкретных примеров ниже упомянутого мной раздела, но для всех масштабов и целей похоже, что вы можете, по крайней мере, скопировать / вставить то, что у вас есть для тестирования (чтобы быть немного более элегантным, есть фрагменты, которые вам не нужны в зависимости отваша конфигурация).

Учитывая, что это от команды CLR, я предполагаю, что вы выберете reg hack или файл конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...