Автообновление
Exe-файл по сути ничего не делает, т.к. даже все форма вынесены в отдельную сборку.
Необходимо сделать автоматическое обновление.
Идти по классическому пути с отдельным екзешником не хочется. Нужно придумать что-то более элегантное.
Вот собственно вопрос. Можно ли удалить сборки, "прикрученные" к основному модулю, в первых строчках метода Main из другой сборки? Или все сборки к этому моменту уже загружены и полного доступа к файлу получить никак не удастся?
Думаю вопрос довольно актуалный... и правильным решением в данном случае захотелось бы воспользоваться не только мне одному :)
.assembly extern mscorlib
{
.ver 2:0:0:0
}
Вот директива .ver ведёт контроль версии используемой библиотеки. Можно убрать вообще эту директиву, тогда приложение будет глотать сборку любой версии.
А вот чё хочешь сделать с Main, непонятно?? Раскрой вопрос! И напомню, что метод, выполняемый при запуске приложения, может называться как угодно, т.к. стартовый метод помечается директивой .entrypoint, а не по имени определяется
1) Запуск программы
2) Проверка версии (в БД)
3) Если версия устарела (у сборок версия может оставаться той же, но вот в программе могут быть внесены изменения),
тогда удаляю те четыре сборки о которых рече шла выше, загружаю обновлённые сборки с FTP-сервера и копирую их на место старых.
4) Запуск ссамой программы (тут вот начинают использоваться классы из сборок)
Беда в том, что, насколько я понял, сборки не дойдя до 4-ого этапа уже загружены и на третьем этапе я обламываюсь на удалении старых версий. Можно как-то победить?
1) Использовать создание объектов из динамически загруженной сборки, например:
ObjectHandle hObj=AppDomain.CreateInstanceFrom("MyAssembly.dll", "MyClass");
MyClass cls=hObj.Unwrap();
Этот способ будет работать, если классы реализуют какие-либо интерфейсы - и их реализация должна быть правилом для всех типов, иначе придётся вовсе вызывать все методы через Reflection.
2) Использовать обёрточное приложение. Создаёшь приложение, которое просматривает обновления, и если они есть, подменяет сборки и запускает уже нужное приложение. Это самый реальный способ, я уже когда-то так делал:
void Main()
{
//проверяем обновления и если нужно подменяем
//сборки
AppDomain yourApp=AppDomain.ExecuteAssembly("yourApp.exe"); //запускаем уже обновлённое приложение
}