Как отобразить номер версии ClickOnce в Windows Forms


у меня есть приложение windows forms, которое развернуто в двух разных местах.

  • Интранет-ClickOnce
  • интернет-устанавливается на ферме citrix через установщик Windows

Я показываю номер версии ClickOnce для click-once deployed versionApplicationDeployment.IsNetworkDeployed.

if (ApplicationDeployment.IsNetworkDeployed)
        return ApplicationDeployment.CurrentDeployment.CurrentVersion;

но для приложения без щелчка я не уверен, как получить версию clickonce, если я не закодирую номер версии в сборке информация.

существует ли автоматический способ получения номера версии ClickOnce для развернутой версии без clickonce?

9 55

9 ответов:

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

  1. добавить ссылку на сборку System.Deployment в проект.

  2. импорт пространства имен в файле класса:

    VB.NET:

    Imports System.Deployment
    

    C#:

    using System.Deployment;
    
  3. извлеките версию ClickOnce из CurrentVersion собственность.

    вы можете получить текущую версию от ApplicationDeployment.CurrentDeployment.CurrentVersion собственность. Это возвращает System.Version

Я бы просто сделал версию сборки основной сборки такой же, как версия CLickOnce каждый раз, когда вы выпускаете новую версию. Затем, когда он запускается как приложение без clickonce, просто используйте отражение, чтобы забрать версию сборки.

попробуйте проверку потока:

if (ApplicationDeployment.IsNetworkDeployed)
        {
            if (ApplicationDeployment.CurrentDeployment.CurrentVersion != ApplicationDeployment.CurrentDeployment.UpdatedVersion)
            {
                Application.ExitThread();
                Application.Restart();
            }
        }

жесткий код, или... Следите за своими версиями (файл, сборка, развертывание) в базе данных. Вызовите базу данных со своей сборкой и получите версию развертывания.

Это предполагает, что вы увеличиваете свои версии логическим образом, так что каждый тип версии имеет отношение. Это большая работа для такой незначительной проблемы. Я бы лично пошел с решением Джареда; хотя я ненавижу жесткое кодирование чего-либо.

не то, чтобы это имело значение три года спустя, но я закончил просто разбор файла манифеста с помощью xml reader.

чтобы расширить решение RobinDotNet:

подсказка: вы можете автоматически запустить программу или скрипт, чтобы сделать это для вас изнутри .csproj файл конфигурации MSBuild каждый раз, когда вы строите. Я сделал это для одного веб-приложения, которое я в настоящее время поддерживаю, выполняя сценарий оболочки Cygwin bash для выполнения некоторого управления версиями h4x для вычисления номера версии из истории Git, а затем предварительно обработайте исходный файл информации о сборке, скомпилированный в сборку выход.

аналогичная вещь может быть сделана для разбора номера версии ClickOnce из файла проекта, т. е. Project.PropertyGroup.ApplicationRevision и Project.PropertyGroup.ApplicationVersion (хотя я не знаю, что означает строка версии, но вы можете просто догадаться, пока она не сломается и не исправит ее) и вставьте эту информацию о версии в информацию о сборке.

я не знаю, когда версия ClickOnce натыкается, но, вероятно, после процесса сборки, поэтому вам может потребоваться поработать с этим решением, чтобы получить новый номер скомпилирован.я думаю, что всегда есть /*h4x*/ +1.

я использовал Cygwin, потому что * Nix scripting намного лучше, чем Windows, и интерпретируемый код избавляет вас от проблем построение программы предварительной сборки перед построением, но вы можете написать программу, используя любую технологию, которую вы хотели (включая C# / .NET). командная строка для предварительного процессора идет внутри PreBuildEvent:

<PropertyGroup>
  <PreBuildEvent>
    $(CYGWIN_ROOT)bin\bash.exe --login -c refresh-version
  </PreBuildEvent>
</PropertyGroup>

как вы можете себе представить, это происходит перед этапом сборки, так что вы можете эффективно предварительно обработать исходный код непосредственно перед его компиляцией. Я не хотел автоматически редактировать Properties\AssemblyInfo.cs файл так, чтобы играть безопасно то, что я сделал, было создать Properties\VersionInfo.base.cs файл, содержащий текстовый шаблон класса с информацией о версии и помеченный как BuildAction=None в настройках проекта, чтобы он не был скомпилирован с проектом:

using System.Reflection;
using EngiCan.Common.Properties;

[assembly: AssemblyVersion("0.$REVNUM_DIV(100)$.$REVNUM_MOD(100)$.$DIRTY$")]
[assembly: AssemblyRevisionIdentifier("$REVID$")]

(очень грязный, бедный синтаксис заполнителя, напоминающий переменные среды Windows с некоторыми дополнительными h4x бросили в был использован для простоты/сложности)

AssemblyRevisionIdentifierAttribute был пользовательский атрибут, который я создал для хранения Git SHA1, так как он гораздо более значим для разработчиков, чем a. b.c. d.

мой refresh-version затем программа скопирует этот файл в Properties\VersionInfo.cs, а затем сделать подстановку информации о версии, которую он уже рассчитал / проанализировал (я использовал sed(1) для замены, которая была еще одним преимуществом использования Cygwin). Properties\VersionInfo.cs был составлен в программу. Этот файл может начинаться пустым, и вы должны игнорировать его своей системой управления версиями, потому что он автоматически меняется, и информация для его создания уже хранится в другом месте.

используя компонент сборки, вы можете прочитать версию click-once из файла проекта и автоматически записать ее в информацию о сборке, чтобы они оба были синхронизированы.

выполните проверку потока, вставьте жесткий код...