Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Обновление развернутого проекта.


Автор: Нов 4.3.2009, 18:12
Доброе время суток.
  Есть большой WinForm проект, включаяющий в себя 10 solutions (45 мб). Написан на .Net 2.0. Устанавливается он с помощью Setup Project VS2005.
Необходимо ставить клиентам расширение функционала + bagfix
Есть два подхода: 1. Реализованное ручками средство, меняющее изменненные dll (так как проект не подписан (Signed)) боюсь получить "ад dll").
                               2. Переустановка всего проекта (удаление старого и установка нового. Но я так подозреваю, что стандартный установщик студии это сделать не сможет).                             
   Вопросы:
1. Существует ли стандартное средство обновления? (Т.е. аналог Setup Project).
2.  Какой из двух подходов рациональнее (может кто то сталкивался)

Автор: nagg 4.3.2009, 21:44
Почему не сможет обновить - повышайте версию в свойствах setup проекта (вам предложат изменить Product code - соглашайтесь) 
и запускайте у заказчика...
А ещё можно посмотреть в сторону ClickOnce

Автор: Нов 5.3.2009, 11:31
Спасибо. Это скорее всего решение. 
Почему то вылетает форма Repeir or Uninstall. Интересно почему он не пишет Update? Ведь версии разные.  
Нужно будет либо при запуске программы запускать скрипт на модернизацию БД либо на отдельном событии это делать. 
Сейчас буду с этим всем разбираться.

Автор: Нов 6.3.2009, 11:12
Итак что получилось:
1. Замена проекта при новой версии. Есть в свойствах Setup Project св-ва DetectNewerInstalledVersion и RemovePreviousVersions. Выставляешь их - и все ок.
2. Добавил новый проект Setup Project для модернизации. Убрал ненужные формы (ввод данных про БД и т.п.) сейчас буду пробавать идти дальше.
Что не получилось:
1. Добавить скрипт расширяющий БД. Но в принципе понимаю в какую сторону необходимо двигаться - добавить класс унаследовать его и т.п.

Вопрос:
 1.  Можно каким то образом влиять на логику появления инсталяционных форм?
 
 

Автор: nagg 7.3.2009, 00:07
Насколько мне известно - никак. Нетакая уж мощная штука, этот сетап. Разве что свои кастом-экшнс можно добавлять.

Автор: mihryak 7.3.2009, 01:56
Цитата(Нов @  6.3.2009,  12:12 Найти цитируемый пост)
Вопрос:
 1.  Можно каким то образом влиять на логику появления инсталяционных форм?

да
Цитата(nagg @  7.3.2009,  01:07 Найти цитируемый пост)
Насколько мне известно - никак. Нетакая уж мощная штука, этот сетап. Разве что свои кастом-экшнс можно добавлять. 

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

Автор: Нов 16.3.2009, 12:35
Возникла следующая проблема:
При той же задаче (сохранить два XML файла конфига при update через инсталлер студии) пока есть два решения:
 Первое:
1. Удалить эти файлы из File System on Target Machine.
2. RemovePreviousVersions = false
Файлы сохраняются. Все что есть в инстеллере - просто переписывает то что уэе установлено. 
Удовлетворяет условию - т.е. и файлы конфига целы и update стоит. Но есть большой минус - в списке установленных программ становиться две программы. Т.е. база и апдейт.
 Второе:
1. Свойство RemovePreviousVersions = true
2. Унаследую System.Configuration.Install.Installer своим классом. Добавляю в Custom Actions->install свое действие (Primary output from имя проекта (Active))
3. Пытаюсь прочитать эти файлы (т.к. при первичной инсталяции в них вписывается значения) в строку и после этого в случае если они не существуют создать их и записать строку. В принципе можно их и скопировать во временный каталог а потом переопределить - не принципиально. 
Но при установке выкидывается Exception File Not Found и выполняется откат. 
Вот код (прошу прощения за VB)
Код

Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
        MyBase.Install(stateSaver)
        Debugger.Break()
        Dim assemblyPath As String = Me.Context.Parameters("assemblypath")
        assemblyPath = assemblyPath.Replace("... .exe", "")
'Собственно нужные файлы...
        Dim confPath As String = assemblyPath & "conf/framework.properties"
        Dim confPath2 As String = assemblyPath & "conf/framework.xml"

        Dim streamReader As New StreamReader(confPath)
        Dim text As String = streamReader.ReadToEnd
        streamReader.Close()

        Dim streamReader2 As New StreamReader(confPath2)
        Dim text2 As String = streamReader2.ReadToEnd
        streamReader2.Close()

      'Замена в них строк соединения и т.п.
        ....

        'Моя попытка в случае их отстуствия создать их и заполнить исходными значениями
        Dim f1 As New FileInfo(confPath)
        If f1.Exists Then
            Dim streamWriter As New StreamWriter(confPath)
            streamWriter.Write(text)
            streamWriter.Close()
        Else
            Dim streamWriter As StreamWriter = File.CreateText(confPath)
            streamWriter.Write(text)
            streamWriter.Close()
        End If

        Dim f2 As New FileInfo(confPath2)
        If f2.Exists Then
            Dim streamWriter2 As New StreamWriter(confPath2)
            streamWriter2.Write(text2)
            streamWriter2.Close()
        Else
            Dim streamWriter As StreamWriter = File.CreateText(confPath)
            streamWriter.Write(text)
            streamWriter.Close()
        End If
    End Sub

Вопросы:
1. Как можно дебажить этот код? Вставлял в код Debugger.Break() - не работает. Аттачился к процессу - и ставил точку останова (No symbol have been loaded on this document...)
2. Как я понимаю, сейчас к моменту наступления Install все файлы предыдущего проекта уже не существуют. Значит необходимо событие, во время которого они еще существуют. И тогда считанные строки можно записать в коллекцию stateSaver и т.д. Итак главный вопрос - что же это за событие? (сейчас я как раз буду искать...)
попробовал OnBeforeInstall - не подходит - файлов  уже нет.

Автор: Partizan 16.3.2009, 13:46
Цитата

Как можно дебажить этот код?


Ведение логов?

Автор: arilou 18.3.2009, 00:49
Нов, инсталлер дебажится только через логи :( еще есть логи MSI. неблагодарное это дело. на старом проекте с определенного момента просто написал полностью кастомный инсталлер. 

Автор: Нов 18.3.2009, 13:05
Спасибо. Решил с логами не разбираться. Понаставил MessageBox. 
В целом - решил проблему следующим образом -при первом запуске считываю конфиг файлы, изменяю в них кон.стринги и записываю их в папку AllUser... при следующем запуске проверяю на существование и если нет - считываю те файлы и перезаписываю в новые. 
Кому интересно - вот код 
Код

Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)       
 MyBase.Install(stateSaver)
      
        Dim text As String = String.Empty
       

        Dim assemblyPath As String = Me.Context.Parameters("assemblypath")
        assemblyPath = assemblyPath.Replace("..., "")
        Dim confPath As String = assemblyPath & "... .properties"
        Dim confPath2 As String = assemblyPath & "... .xml"

        Dim projectInfo As String = Application.CommonAppDataPath
        projectInfo = projectInfo.Substring(0, projectInfo.LastIndexOf("\") + 1)

        Dim confCommPath As String = projectInfo & "... .properties"
        Dim confCommPath2 As String = projectInfo &  "... .xml"

        Dim f1 As New FileInfo(confPath)
        If f1.Exists Then
            Dim streamReader As New StreamReader(confPath)
            text = streamReader.ReadToEnd
            streamReader.Close()
        End If
        'MessageBox.Show(text + "1")

        Dim f2 As New FileInfo(confPath2)
        If f2.Exists Then
            Dim streamReader2 As New StreamReader(confPath2)
            text2 = streamReader2.ReadToEnd
            streamReader2.Close()
        End If
        'MessageBox.Show(text2 + "1")

        'Замена значений кон. стринга и т.п.
       .....


        If f1.Exists Then
            Dim streamWriter As New StreamWriter(confPath)
            streamWriter.Write(text)
            streamWriter.Close()

            'Create common files for save it to update
            Dim streamWriterCommon1 As StreamWriter = File.CreateText(confCommPath)
            streamWriterCommon1.Write(text)
            streamWriterCommon1.Close()
        Else
            Dim streamReaderCommon As New StreamReader(confCommPath)
            text = streamReaderCommon.ReadToEnd
            streamReaderCommon.Close()

            Dim streamWriter As StreamWriter = File.CreateText(confPath)
            streamWriter.Write(text)
            streamWriter.Close()
        End If

        If f2.Exists Then
            Dim streamWriter2 As New StreamWriter(confPath2)
            streamWriter2.Write(text2)
            streamWriter2.Close()

            Dim streamWriterCommon2 As StreamWriter = File.CreateText(confCommPath2)
            streamWriterCommon2.Write(text2)
            streamWriterCommon2.Close()
        Else
            Dim streamReaderCommon2 As New StreamReader(confCommPath2)
            text2 = streamReaderCommon2.ReadToEnd
            streamReaderCommon2.Close()

            Dim streamWriter As StreamWriter = File.CreateText(confPath2)
            streamWriter.Write(text2)
            streamWriter.Close()
        End If
    End Sub

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)