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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> AppDomain, использование различных доменов 
V
    Опции темы
MFSham
  Дата 22.4.2008, 15:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

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



Перед загрузкой приложения надо проверять версию одной .dll и если ее версия билда не совподает с версией которая уже задана в программе, то нужно генерить новую.
Чтобы посмотреть версию сборки ее надо загрузить в домен. Но если версии различны, то ее надо заменить. Но она(сборка) уже загружена в домен и выгрузить можно только домен. Соответственно для просмотра версии сборки нужно создать отдельнгый домен, загрузить сборку туда, посмотреть версию, выгрузить домен. 

Вот что у меня получилось:
Класс который получает версию сборки
Код

namespace DevExpressLocalizer.Util.Localization {
    [Serializable]
    public class VersionLoader : MarshalByRefObject {
        private Version m_version;
        private string m_assemblyPath;              

        private void WorkerMethod() {
            Assembly assm = Assembly.LoadFrom(m_assemblyPath);
            m_version = assm.GetName().Version;                        
        }        

        public Version LoadVersion(string assemblyPath) {
            AppDomainSetup info = new AppDomainSetup();
            info.ApplicationName = "VersionLoader";
            info.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
            info.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
            Evidence evidence = AppDomain.CurrentDomain.Evidence;
            AppDomain anotherDomain = AppDomain.CreateDomain("VersionLoader", evidence, info);
                        
            VersionLoader loader = new VersionLoader();
            loader.m_assemblyPath = assemblyPath;
            try {
                anotherDomain.DoCallBack(loader.WorkerMethod);
            } finally {
                AppDomain.Unload(anotherDomain);
            }
            return loader.m_version;
        }
    }    
}


Проверка версии сборки с программной.

Если версии не совподают, то выполняет следующий кусок кода:
Код

private void GenerateAssembly() {
    // Get current domain
    AppDomain domain = Thread.GetDomain();
    AssemblyBuilder assembly = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save);

    /* генерация необходимой сборки */

    // Save assembly
    assembly.Save(ASSEMBLY_NAME + ".dll");   // <-- The process cannot access the file because it is being used by another process
}


Как видно из ошибки сборка еще висит в памяти, т.е. походу метод AppDomain.Unload(anotherDomain) не сработал или я все-таки загружаю сборку в текущий домен? Тогда как будет правильно? 

Это сообщение отредактировал(а) MFSham - 22.4.2008, 15:17
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
MFSham
Дата 22.4.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

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



Чуть сам разобрался: 
Код

     public class VersionLoader : MarshalByRefObject {}

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

Если передавать по значению
Код

     public class VersionLoader {}

то 
Код

     private void WorkerMethod() {
            Assembly assm = Assembly.LoadFrom(m_assemblyPath);
            m_version = assm.GetName().Version;                        
     }  

m_version в теле метода присвоится значение, но за его пределами будет null(видимо т.к. WorkerMethod() испольняется в другом домене)

Тогда как вытянуть версию из другого домена?
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
Voyager
Дата 22.4.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У домена вроде есть SetData, GetData.
PM   Вверх
MFSham
Дата 22.4.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

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



Цитата(Voyager @  22.4.2008,  16:27 Найти цитируемый пост)
У домена вроде есть SetData, GetData. 

Спасибо за подсказку!   smile 

А то я уже начал копать в сторону System.Runtime.Remoting.Channels.CrossAppDomainChannel  smile 

Вот рабочий вариант:
Код

        private void WorkerMethod() {
            Assembly assm = Assembly.LoadFrom(m_assemblyPath);            
            AppDomain domain = AppDomain.CurrentDomain;
            domain.SetData("Version", assm.GetName().Version);
                        
        } 


А получить версию соответственно:
Код

        m_version = (Version)anotherDomain.GetData("Version");


Спасибо еще раз smile

Это сообщение отредактировал(а) MFSham - 22.4.2008, 16:55
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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