Здравствуйте, Павел Киселев, Вы писали:
ПК>Здравствуйте, Алексей Одинцов, Вы писали:
АО>>1. уберите референс на модуль TEST_LIB. АО>>2. перенесите интерфейс ITest в приложение. АО>>3. попробуйте еще раз.
ПК>Перенес, получил ExecutingAssembly, далее по коду все как и было. ПК>Все получилось, но почему тогда не работает так как написано у меня?
Какой у вас конечный результат получился? Можешь еще раз привести листинг кода с указанием сборок.
Это раз. А два это то, что если сборки находятся в разных местах, и ты уже подгрузил одну сборку, то вторая просто не загрузится. Так что у тебя учавствовала только одна сборка (или, несколько, если были разные версии).
Здравствуйте, mikа, Вы писали:
M>Это раз. А два это то, что если сборки находятся в разных местах, и ты уже подгрузил одну сборку, то вторая просто не загрузится.
Еще как загрузится, если использовать Assembly.LoadFrom.
Здравствуйте, AlexZu, Вы писали:
AZ>Здравствуйте, mikа, Вы писали:
M>>Это раз. А два это то, что если сборки находятся в разных местах, и ты уже подгрузил одну сборку, то вторая просто не загрузится. AZ>Еще как загрузится, если использовать Assembly.LoadFrom.
Если ты думаешь, что между Assembly.LoadFrom и Assembly.Load есть разница в политике функционирования сборок в Нете, то посмотри ниже
Здравствуйте, mikа, Вы писали:
M>Если ты думаешь, что между Assembly.LoadFrom и Assembly.Load есть разница в политике функционирования сборок в Нете,
Есть разница в политике загрузки сборок, и где-то на форуме было обсуждение этого. Да это и эскпериментально легко проверить, попробуй
M>то посмотри ниже M>
Что можно увидеть по этому коду? Что используются перегруженные версии InternalLoad?
Давай уж смотреть дальше:
Assembly.cs: Assembly.InternalLoad
AssemblyNative.cpp: AssemblyNative::Load
Здравствуйте, mikа, Вы писали:
M>А ты случаем не путаешь с LoadFile?
Нет, не путаю... Ты сам-то проверь, зачем спорить не убедившись что так оно и происходит?
Похожая ситуация здесь
Здравствуйте, Dr_Sh0ck, Вы писали: D_S>Если тип один и тот же, то и ссылка будет одной и той же.
а вот это как раз не так. по крайней мере если сделать еще раз LoadFrom даже на тот же файл, который уже загружен.
M>Это раз. А два это то, что если сборки находятся в разных местах, и ты уже подгрузил одну сборку, то вторая просто не загрузится. Так что у тебя учавствовала только одна сборка (или, несколько, если были разные версии).
using System;
namespace SameName
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
System.Reflection.Assembly a1 = System.Reflection.Assembly.LoadFrom("..\\..\\..\\TestLib\\bin\\Debug\\TestLib.dll");
Type t1 = a1.GetType("SameName.Class1");
object o1 = System.Activator.CreateInstance( t1 );
Console.WriteLine( "{0} and {1}", o1 is I1, o1 is I2 );
Type [] ifs = t1.GetInterfaces();
foreach( Type t in ifs )
{
Console.WriteLine( "interface {0}: ", t.AssemblyQualifiedName );
}
Console.WriteLine( typeof(I2).AssemblyQualifiedName );
Type ti2 = a1.GetType("SameName.I2");
Console.WriteLine( ti2 == typeof(I2) );
Console.WriteLine( ti2.AssemblyQualifiedName == typeof(I2).AssemblyQualifiedName );
Console.WriteLine( ti2.Assembly == typeof(I2).Assembly );
Console.WriteLine( ti2.UnderlyingSystemType.AssemblyQualifiedName );
}
}
}
при этом interface SameName.I1 объявлен в BaseLib.dll
интерфейс interface SameName.I2 объявлен в TestLib.dll
класс SameName.C1ass1 объявлен и в TestLib.dll (он и создается)
TestLib.dll ссылается на BaseLib.dll
TestExe.exe (текст которого приведен) ссылается на обе (TestLib.dll и BaseLib.dll)
тем не менее, как видно I2 не распознается как тот же тип.
Здравствуйте, Алексей Одинцов, Вы писали:
АО>Здравствуйте, mikа, Вы писали:
M>>Здравствуйте, Алексей Одинцов, Вы писали: M>>Зааплодь проект. Вообще стожно даже в выводе результаов разобраться
АО>так? здесь
Ага. Посмотрел, потестировал, пришел к такому выводу
LoadFrom cannot be used to load assemblies that have the same identities but different paths; it will load only the first such assembly.
написано не совсем верно. Если сборка загружается динамически (на нее нет ссылки), то ее можно загрузить только в единственном экземпляре. Если же на нее уже была повешена ссылка во время компиляции, то можно загрузить еще один экземпляр этой сборки. При этом, физически она будет отличаться. Отсюда и разные типы.
Вывод. Можно только гадать, чем в нутри отличаються методы Assembly.nLoad и Assembly.nLoadFile. Ведь фактически подгрузка второй динамической сборки (Assembly.LoadFrom) есть вызов Assembly.LoadFile.