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


Автор: dimonpage1 22.10.2007, 08:13
Доброе утро.
есть проект который подгружает несколько модулей 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 при запуске проекта копируются из сетевого ресурса на локальную машину и потом подгружаются...

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

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

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

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

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

Автор: tol05 22.10.2007, 11:18
Цитата(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
    {
    }
}



Автор: dimonpage1 22.10.2007, 12:34
tol05  спасибо за 
Код

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

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

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