Indranil Pal Ответов: 2

Модернизация целевой структуры множественных решений


Ноль вниз голосовать
любимый
Существует ли какой-либо способ обновить целевой фреймворк (например, с 4.5.2 до 4.6.1) без ручного открытия каждого решения и преобразования целевого фреймворка? Я наткнулся на расширение Target Framework Migrator, которое немного облегчает боль и обновляет несколько проектов, присутствующих в решении, но я хочу обновить несколько решений (около 100), которые содержат более 250 проектов, поэтому пытался найти способ автоматизировать эту деятельность.

Что я уже пробовал:

Я пытался найти способ автоматизировать Target Framework Migrator, но поскольку это расширение visual studio, мне не удалось заставить его работать вне среды VS.
Я также пытался обновить cprojs из powershell, но это не только csproj, который изменяется при миграции фреймворка, есть и другие файлы (например, web.config, файл настроек в случае приложений формы и т. д)

Suvendu Shekhar Giri

100 решений за один раз? неужели?
Вы являетесь хостинг - провайдером?

Indranil Pal

Это большое корпоративное приложение с большим количеством компонентов. Любая помощь будет оценена по достоинству

2 Ответов

Рейтинг:
2

Member 12794053

public void ChangeFramework()
{
    //Add Reference to envdte (Assemblies\Extensions\envDTE)


    string SolutionFile = @"C:\MyProject\MyProject.sln";
    string ProjectName = "MyProject";


    //------------------------------------------------------------------------
    //Find the Program ID from the registry for VisualStudio.DTE
    //Look it up In Registry: Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes

    System.Type oType = System.Type.GetTypeFromProgID("VisualStudio.DTE", true);
    EnvDTE.DTE dte = (EnvDTE.DTE)Activator.CreateInstance(oType, true);


    //------------------------------------------------------------------------
    //Open your Solution
    dte.Solution.Open(SolutionFile);



    //------------------------------------------------------------------------
    //Now In your solution go through what is listed in dte.Solution.Projects and find the one that match what you want to change target for

    int iItemsCount = dte.Solution.Projects.Count;
    string sCurrent = "";

    for (int i = 1; i <= iItemsCount; i++)
    {

        sCurrent = dte.Solution.Projects.Item(i).Name;

        if (dte.Solution.Projects.Item(i).Name == ProjectName)
        {
            //Once you find your project, Change the Framework
            EnvDTE.Project oProject = dte.Solution.Projects.Item(i);
            oProject.Properties.Item("TargetFrameworkMoniker").Value = ".NETFramework,Version = v4.6.2";
        }
    }


    //------------------------------------------------------------------------

    //Close your Solution
    dte.Solution.Close();



}


Рейтинг:
0

lw@zi

Вероятно, вы можете написать утилиту, которая ищет csproj и config файлы в определенной папке. Это надо искать TargetFrameworkVersion, compilation, httpRuntime и supportedRuntime теги в этих файлах и обновляйте их по мере необходимости.


Indranil Pal

Спасибо за ваше предложение d@nish, но в приложениях формы файлы свойств изменены (Resource.Designers.cs и настройки.Designer.cs). Попробуйте создать образец формы заявки в 4.5.2 ,измените его на 4.6.1, а затем сравните изменения, вы поймете, о чем я говорю.

lw@zi

Так что просто добавьте это в список. Вы можете использовать MSBuild для компиляции всех решений.

koolprasadd

Как я уже говорил Вы можете написать код для изменения csproj и конфигурационных файлов и изменения заданных параметров но для преобразования DLL файлов вам нужно перекомпилировать их снова

Indranil Pal

Спасибо @Koolprasad за ваше предложение, я тоже думал об этом, но есть еще изменения в форме приложения (проверьте мой комментарий выше)