Можно ли динамически изменять среду выполнения CLR, которая активирует устаревшие сборки (BindAsLegacyV2Runtime)? - PullRequest
1 голос
/ 16 августа 2011

Вот моя проблема:

Я должен сделать плагин, размещенный сторонним приложением.Это приложение является приложением MFC, и для создания моего плагина я должен реализовать COM-объект.Мой COM-объект находится в C # и должен взаимодействовать со сборкой .NET 4 (поэтому мой проект C # нацелен на .NET 4).

Когда я это проверял, он не работал ... Я получил исключение: Сборка смешанного режима построена для версии 'v2.0' среды выполнения и не может быть загружена в среде выполнения 4.0 без дополнительной информации о конфигурации ...

Теперь, так как я делаюинтеграция со сторонним приложением, добавление файла App.exe.config с набором useLegacyV2RuntimeActivationPolicy не представляется приемлемым решением (или это так?).

Я пробовалдобавить дополнительный слой C ++ между приложением MFC и моим кодом .NET.Этот уровень реализует объект COM и перенаправляет все вызовы на C #.Я разрешил свое исключение в смешанном режиме, используя метод ICLRRuntimeInfo :: BindAsLegacyV2Runtime ().Это работало нормально.Однако, если другой плагин, использующий только .NET 2.0, загружен до моего, этот метод завершится неудачно (поскольку среда выполнения .NET 2.0, запускаемая другими плагинами, управляет устаревшими политиками загрузки).

Короче говоря, я застрял,Есть ли способ динамически изменить среду выполнения, отвечающую за устаревшие политики загрузки?

Спасибо за помощь.

1 Ответ

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

Поскольку вы являетесь загруженным компонентом другого приложения, вы всегда будете сталкиваться с проблемой порядка загрузки, вызывающей загрузку разных сред выполнения.Что вы можете сделать, так это попытаться использовать руководство .net 4s In-process бок о бок , чтобы убедиться, что вы загружаете то, что хотите.

И хотя обычно добавление конфигурации приложения для приложения, которое вы не контролируете, является плохой идеей, иногда это единственный способ решить проблему.Я, конечно, вижу добавление app.exe.config и тестирование - однако, если вы распространяете свой плагин среди широкой аудитории, это может оказаться проблематичным.

Если ничего не помогает, возможно, вам придется сделать то, чтомы сделали - запустили части плагина, которые должны использовать ваши сборки .net 4 в отдельном процессе, и создали COM-надстройку «shim», которая взаимодействует с этим процессом.Это не очень хорошее решение, если вы используете пользовательский интерфейс из сборок .net, но оно работает достаточно хорошо для многих других случаев.

...