Мы можем сообщить, что Установка Visual Studio для хранения существующих файлов для переустанавливает?

Я хочу предложить кратчайший ответ (еще один функциональный стиль ):

        Catch<FormatException, OverflowException>(() =>
            {
                WebId = new Guid(queryString["web"]);
            },
            exception =>
            {
                WebId = Guid.Empty;
            });

Для этого вам нужно создать несколько перегрузок метода «Catch», аналогично System.Action:

    [DebuggerNonUserCode]
    public static void Catch<TException1, TException2>(Action tryBlock,
        Action<Exception> catchBlock)
    {
        CatchMany(tryBlock, catchBlock, typeof(TException1), typeof(TException2));
    }

    [DebuggerNonUserCode]
    public static void Catch<TException1, TException2, TException3>(Action tryBlock,
        Action<Exception> catchBlock)
    {
        CatchMany(tryBlock, catchBlock, typeof(TException1), typeof(TException2), typeof(TException3));
    }

и так далее, столько, сколько вы хотите. Но вам нужно сделать это один раз, и вы можете использовать его во всех своих проектах (или, если вы создали пакет nuget, мы могли бы использовать его тоже).

И реализация CatchMany:

    [DebuggerNonUserCode]
    public static void CatchMany(Action tryBlock, Action<Exception> catchBlock,
        params Type[] exceptionTypes)
    {
        try
        {
            tryBlock();
        }
        catch (Exception exception)
        {
            if (exceptionTypes.Contains(exception.GetType())) catchBlock(exception);
            else throw;
        }
    }

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

p.s.2 Если вы хотите вернуть значение из catch, необходимо сделать те же методы Catch, но с параметрами Return и Func вместо Action.

5
задан Peter Mortensen 15 February 2010 в 13:57
поделиться

2 ответа

Когда я был в подобной ситуации, я сделал следующее:

Файлы, которые были настроены каждым пользователем и НЕ должны затрагиваться установщиком, НЕ были включены в MSI (НЕ в Visual Studio Setup Project). Когда приложение было запущено в первый раз, я сгенерировал файлы XML с помощью кода.

Файлы, которые были статическими (например, данные, которые использовались для заполнения раскрывающихся списков), я включил в MSI, и я могу обновить их, создав новый MSI с Visual Studio.

Обычно не включайте настраиваемые файлы в свой проект MSI. Создавайте их в коде для новых пользователей.

Я никогда не пытался сказать MSI не обновлять определенные файлы, включенные в файл MSI. Решение, которое я придумал, идеально мне подошло. Не знаю, можно ли это сделать.

Надеюсь, это поможет.

2
ответ дан 18 December 2019 в 12:01
поделиться

Проект развертывания в VS не перезаписывает файлы. Происходит следующее: поскольку для параметра RemovePreviousVersions установлено значение true, при изменении версии файла программы и GUID ProductCode проекта установки программа сначала удалит предыдущую версию, а затем выполнит чистую установку новой версии.

Чтобы убедиться, что некоторые файлы не перезаписываются, я обычно исключаю их из файлов содержимого или основных выходных файлов (где бы они ни находились), а затем добавляю их отдельно в проект установки. При этом вы можете индивидуально установить свойства для этих файлов. Свойство, которое вы ищете, называется «Постоянное», которое, если установлено значение true, никогда не удалит рассматриваемый файл и, следовательно, никогда не перезапишет его новой версией. Единственным недостатком этого является то, что когда вы удаляете продукт,

[править] Вышесказанное верно для VS 2008 SP1. Я не пробовал его в других версиях, поэтому, надеюсь, вы используете ту же версию VS, или она работает для той версии, которую вы используете.

[edit2] О, вы также можете использовать свойство «Condition» для достижения чего-то подобного. Если вы это сделаете, убедитесь, что для параметра «Transitive» установлено значение True, чтобы условие всегда оценивалось. Не пробовал с Условиями, но это еще один вариант, который вы можете посмотреть. Помимо этих двух, я думаю, что это почти все для проектов развертывания VS.

13
ответ дан 18 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: