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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> блокировка подгружаемых сборок, Assembly.LoadFile 
V
    Опции темы
dimonpage1
Дата 22.10.2007, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброе утро.
есть проект который подгружает несколько модулей 1.dll и 2.dll
библиотека 2.dll также использует функции 1.dll
но когда проект подгружает 1.dll, то библиотека 2.dll уже не может его подгурзить... я так понимаю файл блокируется

как можно подгрузить 1.dll не блокируя себя и дать возможность 2.dllке подгрузать ее?

подгружаю dllки вот таким способом:

Код

                    Assembly common_Load = Assembly.LoadFile("1.dll");                    
                    common_Type = common_Load.GetType("1.MainControl");
                    common_Inst = Activator.CreateInstance(common_Type);

                    Assembly common_Load = Assembly.LoadFile("2.dll");                    
                    a_Type = common_Load.GetType("2.MainControl");
                    a_Inst = Activator.CreateInstance(a_Type);
// сейчас я делаю так...когда подгружаются эти модули то я создаю копию 1.dll только под именем 2_1.dll и в коде 2.dll подгружаю копию 2_1.dll


но чет мне не нравится этот способ )
подскажите, может есть стандартные способы?

p.s. обе dll при запуске проекта копируются из сетевого ресурса на локальную машину и потом подгружаются...
PM MAIL   Вверх
Bladerender
Дата 22.10.2007, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ниразу так не пробовал, но попробуй просто подгрузить просто вторую длл, первая сама подгрузится потому что ее использует вторая. Если такай подход не нравится, то перепроектируй, потому что ИМХО это не есть хорошо, когда прослеживается такая зависимось. Если у тя их токо 2 или 3 то от такой зависимости стопудово можно избавится
PM MAIL   Вверх
dimonpage1
Дата 22.10.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Bladerender @ 22.10.2007,  10:42)
Ниразу так не пробовал, но попробуй просто подгрузить просто вторую длл, первая сама подгрузится потому что ее использует вторая. Если такай подход не нравится, то перепроектируй, потому что ИМХО это не есть хорошо, когда прослеживается такая зависимось. 

я вызываю длл динамически... 

дело в том, что каждая длл это можно сказать отдельная программа. просто вызывается из одного общего проекта (MDI контейнера)
и есть одна длл(1.dll) smile  которая содержит в себе общие функции и процедуры, что бы избежать повторного написания кода и приведение некоторых функций к одному виду в длл модулях.

это нужно для того, что бы при изменении какой-либо длл не перекомпилировать весь проект, ибо изменений модулей в будущем будет много.
PM MAIL   Вверх
tol05
Дата 22.10.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



Цитата(Bladerender @  22.10.2007,  10:42 Найти цитируемый пост)
попробуй просто подгрузить просто вторую длл, первая сама подгрузится потому что ее использует вторая

это в том случае, если вторая ссылается на первую. Если они независимы друг от друга (в моем примере ниже), то не получится.
dimonpage1, если все сборки (программа и библиотеки) работают в одном домене приложения, то ты всегда можешь попросить домен найти тебе любую из загруженных в него сборок. Не важно кто ее загрузил. Если она в домене есть, то второй раз ее грузить не нужно.

основная программа
Код

class Test
{
    public static void Main()
    {
        Assembly asm = Assembly.LoadFrom(@"E:\TempFolder\ConsoleApplication1\ClassLibrary1\bin\Debug\ClassLibrary1.dll");
        Type t1 = asm.GetType("ClassLibrary1.Class1");
        object o1 = Activator.CreateInstance(t1);

        Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies();
        foreach(Assembly assembly in asms)
        {
            if(assembly.GetName().Name == "ClassLibrary2")
            {
                Type t2 = assembly.GetType("ClassLibrary2.Class2");
                object o2 = Activator.CreateInstance(t2);
            }
        }
    }
}

ClassLibrary1.dll
Код

namespace ClassLibrary1
{
    public class Class1
    {
        public Class1()
        {
            Assembly asm2 = Assembly.LoadFrom(@"E:\TempFolder\ConsoleApplication1\ClassLibrary2\bin\Debug\ClassLibrary2.dll");
            Type t2 = asm2.GetType("ClassLibrary2.Class2");
            object o2 = Activator.CreateInstance(t2);
        }
    }
}

ClassLibrary2.dll
Код

namespace ClassLibrary2
{
    public class Class2
    {
    }
}




Это сообщение отредактировал(а) tol05 - 22.10.2007, 11:19


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
dimonpage1
Дата 22.10.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



tol05  спасибо за 
Код

Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies();

 это то, что мне нужно smile

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

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


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

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


 




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


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

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