[INFO] Зависимости сборок
От: baranovda Российская Империя  
Дата: 06.06.08 21:34
Оценка:
Мне потребовалось упорядочить отсортировать некоторую коллекцию объектов, классы которых определены в разных, динамически загружаемых при помощи метода Assembly.LoadFrom() сборках, по принципу зависимости сборок друг от друга. Алгоритм сортировки выглядит примерно так:

int CompareTo(Object a, Object b)
{
  Assembly asmA = a.GetType().Assembly;
  Assembly asmB = b.GetType().Assembly;

  AssemblyName[] asmARefNames = asmA.GetReferencedAssemblies();
  foreach (asmARefName in asmARefNames)
  {
    if (asmARefName.Equals(asmBRefName))
      return +1;
    ...
  }
  ...
  return 0; // -1
}


Выяснилась следующая вещь: если проект A в солюшене ссылается на проект B, но не создает ни одного экземпляра класса из проекта B или использует только константы из проекта B, то сборка B не попадает в список сборок, на которые ссылается сборка А, в момент вызова метода asmA.GetReferencedAssemblies().
Re: [INFO] Зависимости сборок
От: stump http://stump-workshop.blogspot.com/
Дата: 07.06.08 05:23
Оценка:
Здравствуйте, baranovda, Вы писали:

B>Выяснилась следующая вещь: если проект A в солюшене ссылается на проект B, но не создает ни одного экземпляра класса из проекта B или использует только константы из проекта B, то сборка B не попадает в список сборок, на которые ссылается сборка А, в момент вызова метода asmA.GetReferencedAssemblies().


Ну, если сборка А использует только константы из сборки B, то в манифесте А даже не будет ссылки на B, потому что константы инлайнятся в код по месту вызова.
А вообще CLR подгружает сборки по мере необходимости. Это общеизвестный факт. Но на GetReferencedAssemblies() это не влияет. Этот метод выдает не загруженные в данный момент сборки, а сборки на которые есть ссылки в манифесте.
Понедельник начинается в субботу
Re: [INFO] Зависимости сборок
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.06.08 07:59
Оценка:
Здравствуйте, baranovda, Вы писали:

B>Выяснилась следующая вещь: если проект A в солюшене ссылается на проект B, но не создает ни одного экземпляра класса из проекта B или использует только константы из проекта B, то сборка B не попадает в список сборок, на которые ссылается сборка А, в момент вызова метода asmA.GetReferencedAssemblies().


Компилятор C# выкидывает при компиляции все незадействованные ссылки.
... <<RSDN@Home 1.2.0 alpha 4 rev. 1090 on Windows Vista 6.0.6001.65536>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.