Как я могу постепенно изменить целевую платформу с 4.0 до 3.5 проекта / решения? - PullRequest
1 голос
/ 10 января 2011

Редактировать 3: После дополнительного поиска в Google, похоже, что вы не можете иметь свойство TargetFrameworkMoniker в приложении .NET 3.5.Так что, думаю, мне следует задать другой вопрос.
Как изменить целевую среду с 4.0 на 3.5?К сожалению, я могу только найти материал о том, как пойти другим путем.или еще лучше, как мне программно установить целевую версию фреймворка в проект, отличный от 4.0?

Оригинальный вопрос: я только что перешел на vs2010.У меня есть приложение, которое использует .net 3.5.Он загружает плагины, которые генерируются другим приложением.Плагины используют .net 4 и не могут быть загружены.Я использую EnvDTE.Project, чтобы создать проект и установить настройки.Я не могу найти, какие настройки нужно установить для этого.

Редактировать 1: я генерирую код для примерно 50 решений.Когда я переключился с vs2005 на vs2010, проекты в этих решениях по умолчанию были на .NET Framework 4.0.Поэтому мне нужно установить .NET Framework на 3,5, когда я генерирую код для этих решений.

Редактировать 2: После долгих поисков я нашел это .тогда я попробовал это:

loProp = vsGetProperty("TargetFrameworkMoniker");
vsSetValue(loProp, ".NETFramework,Version=v3.5");

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

project.Properties.Item("TargetFrameworkMoniker").Value =   ".NETFramework,Version=v4.0,Profile=Client";

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

Целевая среда генераторов кода равна 3.5, поэтому я не могу использовать класс FrameworkName, как показано во втором примере в этой ссылке.

вот vsGetProperty

    protected Property vsGetProperty(string aProperty)
    {
        bool lbDone = false;
        int liCount = 0;
        Property loProp;
        while (!lbDone && liCount < pMaxRetries)
        {
            try
            {
                loProp = pProject.Properties.Item(aProperty);
                lbDone = true;
                return loProp;
            }
            catch (System.Runtime.InteropServices.COMException loE)
            {
                liCount++;
                if ((uint)loE.ErrorCode == 0x80010001)
                {
                    // RPC_E_CALL_REJECTED - sleep half sec then try again
                    System.Threading.Thread.Sleep(pDelayBetweenRetry);
                }
            }
        }
        return null;
    }

и vsSetValue

    protected void vsSetValue(Property aProperty, string aValue)
    {
        bool lbDone = false;
        int liCount = 0;
        while (!lbDone && liCount < pMaxRetries)
        {
            try
            {
                aProperty.Value = aValue;
                lbDone = true;
            }
            catch (System.Runtime.InteropServices.COMException loE)
            {
                liCount++;
                if ((uint)loE.ErrorCode == 0x80010001)
                {
                    // RPC_E_CALL_REJECTED - sleep half sec then try again
                    System.Threading.Thread.Sleep(pDelayBetweenRetry);
                }
            }
        }
    }

1 Ответ

0 голосов
/ 11 января 2011

Я думаю, вы можете приложить слишком много усилий и подумать над своей проблемой / решением. Может быть, это отличается от того, сколько кода у вас есть в ваших проектах. Пока они не используют функции 4.0, я не понимаю, почему вы не можете открыть свойства проекта (щелкните правой кнопкой мыши имя проекта в обозревателе решений, выберите свойства) и измените целевую инфраструктуру на вкладке приложения.

При переключении должно отображаться предупреждение. Вот что случилось со мной, когда я сменил профиль клиента с 4.0 на 4.0. Я хотел бы убедиться, что у вас есть весь ваш код проверен, а затем попробуйте этот метод. В случае сбоя и / или прерывания не фиксируйте преобразование и не заменяйте его последним.

...