Можно ли загрузить сборку, ориентированную на другую версию среды выполнения .NET, в новом домене приложения? - PullRequest
3 голосов
/ 26 марта 2010

У меня есть приложение, основанное на среде выполнения .NET 2. Я хочу добавить немного поддержки для .NET 4, но не хочу (в краткосрочной перспективе) конвертировать все приложение (которое очень большое) в целевой .NET 4.

Я попробовал «очевидный» подход к созданию файла приложения .config, имея следующее:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" />
</startup>

но я столкнулся с некоторыми проблемами, которые я заметил здесь .

У меня появилась идея создать отдельный домен приложения. Чтобы проверить это, я создал проект WinForm для .NET 2. Затем я создал библиотеку классов для .NET 4. В свой проект WinForm я добавил следующий код:

        AppDomainSetup setup = new AppDomainSetup();
        setup.ApplicationBase = "path to .NET 4 assembly";
        setup.ConfigurationFile = System.Environment.CurrentDirectory + 
          "\\DotNet4AppDomain.exe.config";

        // Set up the Evidence
        Evidence baseEvidence = AppDomain.CurrentDomain.Evidence;
        Evidence evidence = new Evidence(baseEvidence);

        // Create the AppDomain      
        AppDomain dotNet4AppDomain = AppDomain.CreateDomain("DotNet4AppDomain", evidence, setup);
        try
        {
            Assembly doNet4Assembly = dotNet4AppDomain.Load(
               new AssemblyName("MyDotNet4Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=66f0dac1b575e793"));
            MessageBox.Show(doNet4Assembly.FullName);
        }
        finally
        {
            AppDomain.Unload(dotNet4AppDomain);
        }

Мой файл DotNet4AppDomain.exe.config выглядит следующим образом:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" />
</startup>

К сожалению, это вызывает исключение BadImageFormatException при выполнении dotNet4AppDomain.Load. Я что-то не так делаю в своем коде, или я пытаюсь просто не работать?

Спасибо!

Ответы [ 2 ]

1 голос
/ 26 марта 2010

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

Единственным способом сделать это может быть размещение второго CLR внутри вашего процесса, как объяснено в Можно ли разместить CLR в программе на C? с помощью .Net 4.0 стало возможным.

0 голосов
/ 26 марта 2010

Я был бы склонен подозревать, что версия 2 среды выполнения .NET не имеет ни понятия, ни понимания .NET 4. По звучанию и характеру вашего вопроса вы имеете дело с ним наоборот ... Вы пытались скомпилировать и настроить таргетинг на .NET 4 для загрузки библиотеки времени выполнения .NET 2 ... Я бы не подумал, что можно смешивать разные версии скомпилированного кода (одну для .NET 4, а другую для .NET 2). в том же процессе ...

...