Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Автоматическое обновление программы 
:(
    Опции темы
andrey_pro
Дата 7.1.2010, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.9.2007

Репутация: нет
Всего: нет



Всем привет, нужна подсказка как лучше сделать.

Есть моя программа написанная на .NET. Она весит 1 Мб. Состоит из 4 файлов.

Мне нужно чтобы при запуске программы проверялось наличие новой версии 
на сайте (куда я буду выкладывать) и если найдена новая версия то автоматически 
обновлять программу.

Как лучше сделать?
PM MAIL   Вверх
ДобренькийПапаша
Дата 7.1.2010, 10:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Если я не ошибаюсь надо пояндексить технологию ClickOnce.

Приложение ClickOnce имеет два XML-файла-манифеста:манифест приложения и манифест развёртывания.
Задать свойства и создать публикацию в Visual Studio можно во вкладке Publish окна Project Properties. Publish Wizard можете воспользоваться.

Ограничения ClickOnce:
1)Не поддерживается инсталляция драйверов.
2)Не поддерживается инсталляция в GAC.
3)Нельзя добавить приложение в группу начального запуска.
4)Нельзя добавить приложение в меню "Избранное"



--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
jonie
Дата 7.1.2010, 21:15 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Ну как вариант, можно свой написать велосипед. Пишется отдельная програмулина-запускальщик основной (или, попросту вся программа выносится в библиотеку, а в exe остается только запускальщик). Ну и дальше ручками проверяем, закачиваем если надо и продолжнаем работать...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
andrey_pro
Дата 8.1.2010, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.9.2007

Репутация: нет
Всего: нет



1. Если ClickOnce:
   Я делаю обфускацию своего приложения. Как будет обфускация дружить с ClickOnce?
   Как варианты решения?


2. Если своя программа-запускальщик:
   Она будет обновлять файлы программы при необходимости.
   А как она будет дружить с безопасностью Vista/7. На сколько я знаю в этих осях очень строгая политика в Program Files и могут быть проблемы при обновлении ... прав не хватит или еще чего.
   Как быть?
PM MAIL   Вверх
Heinzz
Дата 8.1.2010, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



Цитата(andrey_pro @  8.1.2010,  18:56 Найти цитируемый пост)
 А как она будет дружить с безопасностью Vista/7. На сколько я знаю в этих осях очень строгая политика в Program Files и могут быть проблемы при обновлении ... прав не хватит или еще чего.

пишите в IsolatedStorage туда всегда прав хватит или C:\Users\CurrentUser\AppData\Local

По правильному логику надо реализовывать в dll-ках и при обновлении выпускать новые dll-ки.


--------------------
user posted image
PM MAIL   Вверх
Heinzz
Дата 8.1.2010, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



...


Это сообщение отредактировал(а) Heinzz - 8.1.2010, 19:56


--------------------
user posted image
PM MAIL   Вверх
Zakonnic
Дата 9.1.2010, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 25.4.2006

Репутация: 2
Всего: 6



С ClickOnce не все так просто. Это средство в основном для удобного распространения небольших приложений внутри локальной сети компании, поэтому установка происходит не в ProgramFiles, а в особую папку со случайным названием в профиле пользователя. На деле это означает возможные проблемы с настройками и путями, так как новые версии будут устанавливаься в другие папки.

Написание собственного велосипеда мне видится более надежным и управляемым способом. Кроме того, зачем упускать такой шанс получить удовольствие?  smile 
--------------------
...и никогда не пишите в комментариях правду
PM MAIL ICQ   Вверх
jonie
Дата 9.1.2010, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата

2. Если своя программа-запускальщик:
   Она будет обновлять файлы программы при необходимости.
   А как она будет дружить с безопасностью Vista/7. На сколько я знаю в этих осях очень строгая политика в Program Files и могут быть проблемы при обновлении ... прав не хватит или еще чего.
   Как быть? 
MSI пакет делать и запускать обновление через законную систему обновлений, не запуская саму программу.... Там админ права понадобятся, конечно же.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
andrey_pro
Дата 9.1.2010, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.9.2007

Репутация: нет
Всего: нет



Цитата(Heinzz @  8.1.2010,  19:34 Найти цитируемый пост)
пишите в IsolatedStorage туда всегда прав хватит или C:\Users\CurrentUser\AppData\Local


А можно с этим поподробнее.

Вот у меня не большое приложение ~1мб (установщик)

Пользователь запускает установщик и по умолчанию ставит в Program Files.
При запуске программа проверяет наличие новой версии на сайте
и если находит надо обновить программу.

Вопрос КАК??? и куда должен писать новые dll
PM MAIL   Вверх
Heinzz
Дата 9.1.2010, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



Цитата(andrey_pro @  9.1.2010,  07:53 Найти цитируемый пост)

Пользователь запускает установщик и по умолчанию ставит в Program Files.
При запуске программа проверяет наличие новой версии на сайте
и если находит надо обновить программу.

Вопрос КАК??? и куда должен писать новые dll 

Isolated Storage
те права для записи в Isolated Storage имеют даже приложения Internet_Zone!
Пусть Ваше приложение пишет туда dll-ки и например загружает их динамически. Динамическое связывание рекомендовано для PlugIn-ов.
зы Если хотите могу скинуть примерчик по связыванию где меняется функциональность программы.

Добавлено через 6 минут
Чтобы писать в ProgramFiles - нужны админские привелегии которые не всегда есть + даже если есть в Vista и W7 лезут окна подтверждения действия, тк даже админ там без подтверждения в окошке имеет лишь права опытного пользователя.
А вот писать в  C:\Users\CurrentUser\AppData\Local админские права не нужны. Посмотрите туда, наверняка какие-то программы там у Вас уже прописались smile

Добавлено через 7 минут и 24 секунды
зы файлы IsolatedStorage специфичные для пользователя там и находятся


--------------------
user posted image
PM MAIL   Вверх
andrey_pro
Дата 9.1.2010, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.9.2007

Репутация: нет
Всего: нет



Цитата(Heinzz @  9.1.2010,  11:00 Найти цитируемый пост)
Если хотите могу скинуть примерчик по связыванию где меняется функциональность программы.


буду очень благодарен.
Это для меня новое, ни разу с этим не сталкивался.
PM MAIL   Вверх
Heinzz
Дата 9.1.2010, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



Программа загружает все dll-ки из своей папки в меню и пользуется той которую выберет пользователь.
Код

public partial class Form1 : Form
    {
        string asmName;
        Dictionary<string, string> assembliesDictionary;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            asmName = "Default";
            MenuItem open = this.mainMenu1.MenuItems[1];
            open.Name = "Open";
            MenuItem defaultItem = new MenuItem(asmName);
            defaultItem.Name = asmName;
            open.MenuItems.Add(defaultItem);
            defaultItem.Checked = true;
            defaultItem.Click+=new EventHandler(Item_Click);
            assembliesDictionary = new Dictionary<string, string>();
            LoadListOfAssemblies();

        }

        private void LoadListOfAssemblies()
        {
            foreach (string file in Directory.GetFiles(Environment.CurrentDirectory, "*.dll"))
            {
                FileInfo f = new FileInfo(file);
                Assembly asm = Assembly.LoadFile(f.FullName);
                string typeString = "Pluggins" + ".Questions";
                Type question = asm.GetType(typeString);
                if (question != null)
                {
                    string assemblyName = f.Name.Split('.')[0];
                    assembliesDictionary.Add(assemblyName, f.FullName);
                    this.AddAssemblyToMenu(assemblyName);
                }
            }
        }

        private void AddAssemblyToMenu(string name)
        {
            MenuItem newItem = new MenuItem(name);
            newItem.Name = name;
            this.mainMenu1.MenuItems[1].MenuItems.Add(newItem);
            newItem.Click += new EventHandler(Item_Click);
        }

        void Item_Click(object sender, EventArgs e)
        {
            MenuItem clickedItem =(MenuItem)sender;
            MenuItem checkedItem = (this.mainMenu1.MenuItems["Open"]).MenuItems[asmName];
            if (clickedItem!=checkedItem)
            {
                clickedItem.Checked = true;
                checkedItem.Checked = false;
                asmName = clickedItem.Name;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string name = "-";
            string occupation = "-";
            int age = 0;
            Assembly asm = Assembly.GetExecutingAssembly();

            if (asmName == "Default")
            {
                asm = Assembly.GetExecutingAssembly();
            }
            else
            {
                string assemblyFileName = assembliesDictionary[asmName];
                asm = Assembly.LoadFile(assemblyFileName);
            }

            //namespace should be Pluggins
            string typeString = "Pluggins" + ".Questions";
            Type question = asm.GetType(typeString);
            ConstructorInfo constructor = question.GetConstructor(new Type[] { });
            Object frame = constructor.Invoke(new object[] { });
            MethodInfo show = question.GetMethod("ShowDialog", new Type[] { });
            show.Invoke(frame, null);

            PropertyInfo propName = question.GetProperty("name");
            name = (string)propName.GetValue(frame, null);
            PropertyInfo propOccupation = question.GetProperty("occupation");
            occupation = (string)propOccupation.GetValue(frame, null);
            PropertyInfo propAge = question.GetProperty("age");
            age = (int)propAge.GetValue(frame, null);
            this.richTextBox1.Text = "Name\t\t" + name + "\n" + "occupation\t" + occupation + "\n" + "age\t\t" + age;
        }
    }


первая dll-ка -ввод имени, специальности, возраста в винформс.
Код

public partial class Questions : Form
    {
        public string name{get;set;}
        public string occupation{get;set;}
        public int age{get;set;}

        public Questions()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.name = this.textBox1.Text;
            this.occupation = this.textBox2.Text;
            this.age = int.Parse(this.textBox3.Text);
            this.Close();
        }
    }


вторая dll-ка - консольный ввод той же информации
Код

 public partial class Questions 
    {
        [DllImport("kernel32.dll")]
        static extern bool AttachConsole(int dwProcessId);
        [DllImport("kernel32.dll")]
        static extern void AllocConsole();
        [DllImport("kernel32.dll")]
        static extern void FreeConsole();
        private const int ATTACH_PARENT_PROCESS = -1;

        public string name { get; set; }
        public string occupation { get; set; }
        public int age { get; set; }

        public Questions()
        {
            AttachConsole(ATTACH_PARENT_PROCESS);
        }

        public void ShowDialog()
        {
            AllocConsole();
            Console.WriteLine("Hi! Enter Your name");
            name = Console.ReadLine();
            Console.WriteLine("Enter Your occupation");
            occupation = Console.ReadLine();
            Console.WriteLine("Enter Your age");
            string s = Console.ReadLine();
            age = int.Parse(s);
            Console.WriteLine("Thank You!");
            Console.Beep(3000, 1000);
            FreeConsole();
        }

    }


Библиотек можно сделать сколько угодно.
те мы можем подключить любой класс из библиотеки через reflection  и вызывать методы в нем реализованные. Так в новой версии можно реализовать проверку правильности ввода полей или сделать ее под web-интерфейс.

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


--------------------
user posted image
PM MAIL   Вверх
dazy
Дата 10.1.2010, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: 1
Всего: 8



Учтите, что с isolated storage  тоже не все так просто. В принципе различные политики безопасности (читай корпоративные админы) могу урезать выделяемое место. Понятно, что могут урезать и до нуля. В разных версиях винды путь до Application Data различный. Да, и работать с isolated storage нужно через специальный класс. В общем, курите внимательно.


PM MAIL   Вверх
userdab
Дата 4.9.2010, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 3.9.2010

Репутация: нет
Всего: нет



Про автоматическое обновление программы и ClickOnce можно почитать здесь
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.