Есть ли способ преобразовать библиотеку .NET 4 в приложение .NET 2? - PullRequest
0 голосов
/ 05 января 2011

В настоящее время я работаю над несколькими старыми приложениями, написанными на различных языках, совместимых с COM, но которые имеют архитектуру плагинов, которая поддерживает только плагины .NET2. Мы попытались перейти на .NET4 и потерпели неудачу, поэтому пока мы застряли с .NET2 в качестве среды выполнения CLR в нашем приложении.

Теперь нам нужно получить доступ к некоторым довольно сложным веб-сервисам, для которых мы хотели бы использовать WCF. Первый вариант - использовать оболочку COM и вызывать библиотеки .NET4 из собственного кода, но мы теряем использование нашего механизма плагинов. Я хотел бы знать, есть ли способ запустить компоненты .net 2 и 4 в том же процессе, или каким-то другим способом я мог бы решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 05 января 2011

Небольшое изменение в подходе @ Kennet заключается в том, чтобы просто изменить файл конфигурации, чтобы приложение работало в .Net 4 без перекомпиляции.

Вот статья, которую я нашел на эту тему: Запуск приложений .NET 2 Runtime в среде .NET 4 Runtime

Вот важные моменты из статьи (я сам не пробовал) ...

<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
  <NetFx40_LegacySecurityPolicy enabled="true"/>
</runtime>
1 голос
/ 05 января 2011

Вот ужасная идея (это настолько плохая идея, что я бы уволил меня, если бы предложил).

Возможно, вы сможете принудительно запустить приложение в .Net 4 CLR с помощью приложения-загрузчика.

Приложение-загрузчик должно быть исполняемым .Net 4, которое ничего не делает, кроме как загружает исполняемую сборку приложения, находит точку входа в программу и выполняет ее. Поскольку сборки .Net 2 являются допустимыми 4 сборками, он не должен работать без проблем, но затем должен поддерживать плагины .Net 4.

Обновление:

Я запустил быструю тестовую версию, и она, по крайней мере, может работать. Вот исходный код для программы-загрузчика. Мое приложение .Net 2.0 было названо «App20.exe», замените ваше собственное имя там.

using System;
using System.Reflection;
using System.IO;

namespace Loader
{
    class Program
    {
        static void Main(string[] args)
        {
            string oldAppName = Path.GetFullPath("App20.exe");
            Assembly asm = Assembly.LoadFile(oldAppName);
            Console.WriteLine(asm.EntryPoint.Name);
            asm.EntryPoint.Invoke(null, new object[]{args});
        }
    }
}
...