Проблема загрузки сборки .Net, если нет прямой ссылки на элемент сборки - PullRequest
0 голосов
/ 09 декабря 2011

Вот ситуация: у меня два проекта.ConsoleApp и библиотека классов.Консольное приложение ссылается на библиотеку классов.В библиотеке классов есть класс Person.

Следующий код возвращает переменную типа null:

static void Main(string[] args)
{
   Type type = AppDomain.CurrentDomain.GetAssemblies()
.Select(a => a.GetType("LoadTest.Person", false)).Where(t => t != null).FirstOrDefault();
}

Однако, если я добавляю прямое объявление, код работает хорошо.

static void Main(string[] args)
{
   Person p = null;
   Type type = AppDomain.CurrentDomain.GetAssemblies()
.Select(a => a.GetType("LoadTest.Person", false)).Where(t => t != null).FirstOrDefault();
}

Это известная проблема.Однако есть ли какое-либо решение без объявления какого-либо члена сборки?

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 09 декабря 2011

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

Вам необходимо загрузить библиотеку классов в контекст AppDomain для ваших сборок.Исходя из вашего примера, поместите это

AppDomain.CurrentDomain.Load("LoadTest");

, и вы можете получить список сборок во время выполнения, используя

Assembly[] assems = AppDomain.CurrentDomain.GetAssemblies();
1 голос
/ 09 декабря 2011

Используйте методы Assembly.Load, чтобы загрузить сборку и затем создать из нее тип.

1 голос
/ 09 декабря 2011

Попробуйте указать имя сборки, например:

GetType("LoadTest.Person, nameoftheassemblycontainingperson");

, скажем, если ваш класс содержится в LoadTest.dll, вы можете написать:

GetType("LoadTest.Person, LoadTest");

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

1 голос
/ 09 декабря 2011

Вы можете просто:

  var personType = typeof(Person)

, который загрузит сборку и даст вам нужный тип, но если по какой-то причине вы хотите использовать класс Assembly, сделайте следующее:

  var type = Assembly.GetAssembly(typeof(Person)).GetType("LoadTest.Person");

или, если вы не знаете ни типа во время выполнения, ни имени файла dll, но можете быть уверены, что dll находится в рабочем каталоге, вы можете сделать это:

  var type = new DirectoryInfo(Environment.CurrentDirectory).GetFiles("*.dll").Select(f => Assembly.LoadFile(f.FullName)).Select(assembly => assembly.GetType("LoadTest.Person")).FirstOrDefault();
...