Re[5]: Приведение типа
От: mikа Stock#
Дата: 16.12.03 19:23
Оценка: -1
Здравствуйте, Павел Киселев, Вы писали:

ПК>Здравствуйте, Алексей Одинцов, Вы писали:


АО>>1. уберите референс на модуль TEST_LIB.

АО>>2. перенесите интерфейс ITest в приложение.
АО>>3. попробуйте еще раз.

ПК>Перенес, получил ExecutingAssembly, далее по коду все как и было.

ПК>Все получилось, но почему тогда не работает так как написано у меня?

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

Это раз. А два это то, что если сборки находятся в разных местах, и ты уже подгрузил одну сборку, то вторая просто не загрузится. Так что у тебя учавствовала только одна сборка (или, несколько, если были разные версии).
Re[6]: Приведение типа
От: Dr_Sh0ck Беларусь  
Дата: 17.12.03 06:26
Оценка:
Здравствуйте, Алексей Одинцов, Вы писали:

АО>и похоже если их (ассемблей) 2, то типы эти возвращают разные ссылки как это разрулить я


Если тип один и тот же, то и ссылка будет одной и той же.
Do not fake yourself ;)
ICQ#: 198114726
Re[6]: Приведение типа
От: AlexZu Россия  
Дата: 17.12.03 09:34
Оценка:
Здравствуйте, mikа, Вы писали:

M>Это раз. А два это то, что если сборки находятся в разных местах, и ты уже подгрузил одну сборку, то вторая просто не загрузится.

Еще как загрузится, если использовать Assembly.LoadFrom.
Re[7]: Приведение типа
От: mikа Stock#
Дата: 17.12.03 10:13
Оценка:
Здравствуйте, AlexZu, Вы писали:

AZ>Здравствуйте, mikа, Вы писали:


M>>Это раз. А два это то, что если сборки находятся в разных местах, и ты уже подгрузил одну сборку, то вторая просто не загрузится.

AZ>Еще как загрузится, если использовать Assembly.LoadFrom.

Если ты думаешь, что между Assembly.LoadFrom и Assembly.Load есть разница в политике функционирования сборок в Нете, то посмотри ниже

public static Assembly LoadFrom(string assemblyFile, Evidence securityEvidence, byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
   {
      if (assemblyFile == null)
      {
        throw new ArgumentNullException("assemblyFile");
      }
      AssemblyName assemblyName = new AssemblyName();
      assemblyName.CodeBase = assemblyFile;
      assemblyName.SetHashControl(hashValue, hashAlgorithm);
      StackCrawlMark stackCrawlMark = StackCrawlMark.LookForMyCaller;
      return InternalLoad(assemblyName, false, securityEvidence, ref stackCrawlMark);
    }

    public static Assembly Load(string assemblyString)
    {
      StackCrawlMark stackCrawlMark = StackCrawlMark.LookForMyCaller;
      return InternalLoad(assemblyString, null, ref stackCrawlMark);
    }
Re[8]: Приведение типа
От: AlexZu Россия  
Дата: 17.12.03 10:36
Оценка: -1
Здравствуйте, mikа, Вы писали:

M>Если ты думаешь, что между Assembly.LoadFrom и Assembly.Load есть разница в политике функционирования сборок в Нете,

Есть разница в политике загрузки сборок, и где-то на форуме было обсуждение этого. Да это и эскпериментально легко проверить, попробуй

M>то посмотри ниже

M>
M>public static Assembly LoadFrom(string assemblyFile, Evidence securityEvidence, byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
M>   {
M>      if (assemblyFile == null)
M>      {
M>        throw new ArgumentNullException("assemblyFile");
M>      }
M>      AssemblyName assemblyName = new AssemblyName();
M>      assemblyName.CodeBase = assemblyFile;
M>      assemblyName.SetHashControl(hashValue, hashAlgorithm);
M>      StackCrawlMark stackCrawlMark = StackCrawlMark.LookForMyCaller;
M>      return InternalLoad(assemblyName, false, securityEvidence, ref stackCrawlMark);
M>    }

M>    public static Assembly Load(string assemblyString)
M>    {
M>      StackCrawlMark stackCrawlMark = StackCrawlMark.LookForMyCaller;
M>      return InternalLoad(assemblyString, null, ref stackCrawlMark);
M>    }
M>


Что можно увидеть по этому коду? Что используются перегруженные версии InternalLoad?
Давай уж смотреть дальше:
Assembly.cs: Assembly.InternalLoad
AssemblyNative.cpp: AssemblyNative::Load
Re[9]: Приведение типа
От: mikа Stock#
Дата: 17.12.03 10:56
Оценка:
Здравствуйте, AlexZu, Вы писали:

А ты случаем не путаешь с LoadFile?
Re[10]: Приведение типа
От: AlexZu Россия  
Дата: 17.12.03 11:16
Оценка: :)
Здравствуйте, mikа, Вы писали:

M>А ты случаем не путаешь с LoadFile?

Нет, не путаю... Ты сам-то проверь, зачем спорить не убедившись что так оно и происходит?
Похожая ситуация здесь
Автор: avpavlov
Дата: 28.01.03
.
Re[7]: Приведение типа
От: Алексей Одинцов Россия  
Дата: 17.12.03 11:22
Оценка:
Здравствуйте, Dr_Sh0ck, Вы писали:
D_S>Если тип один и тот же, то и ссылка будет одной и той же.
а вот это как раз не так. по крайней мере если сделать еще раз LoadFrom даже на тот же файл, который уже загружен.
... << RSDN@Home 1.1.0 stable >>
Re[6]: Приведение типа
От: Алексей Одинцов Россия  
Дата: 17.12.03 11:30
Оценка:
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 );
        }
    }
}


получается:
True and False
interface SameName.I2, TestLib, Version=1.0.1446.31382, Culture=neutral, PublicK
eyToken=null:
interface SameName.I1, BaseLib, Version=1.0.1446.31382, Culture=neutral, PublicK
eyToken=null:
SameName.I2, TestLib, Version=1.0.1446.31382, Culture=neutral, PublicKeyToken=nu
ll
False
True
False
SameName.I2, TestLib, Version=1.0.1446.31382, Culture=neutral, PublicKeyToken=nu
ll


при этом 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 не распознается как тот же тип.
... << RSDN@Home 1.1.0 stable >>
Re[7]: Приведение типа
От: mikа Stock#
Дата: 17.12.03 12:12
Оценка:
Здравствуйте, Алексей Одинцов, Вы писали:

Зааплодь проект. Вообще стожно даже в выводе результаов разобраться
Re[8]: Приведение типа
От: Алексей Одинцов Россия  
Дата: 17.12.03 12:15
Оценка:
Здравствуйте, mikа, Вы писали:

M>Здравствуйте, Алексей Одинцов, Вы писали:

M>Зааплодь проект. Вообще стожно даже в выводе результаов разобраться

так? здесь
... << RSDN@Home 1.1.0 stable >>
Re[9]: Приведение типа
От: mikа Stock#
Дата: 17.12.03 12:52
Оценка: 1 (1)
Здравствуйте, Алексей Одинцов, Вы писали:

АО>Здравствуйте, mikа, Вы писали:


M>>Здравствуйте, Алексей Одинцов, Вы писали:

M>>Зааплодь проект. Вообще стожно даже в выводе результаов разобраться

АО>так? здесь


Ага. Посмотрел, потестировал, пришел к такому выводу

http://longhorn.msdn.microsoft.com/lhsdk/ref/ns/system.reflection/c/assembly/m/loadfile0.aspx

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.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.