Устранение неполадок в исключении контейнера Unity IoC («Указано неверное имя сборки или кодовая база») - PullRequest
0 голосов
/ 20 мая 2018

В моей кодовой базе я успешно создал контейнер, но при попытке его настройки возникла исключительная ситуация:

_container = new UnityContainer();
var unityConfigurationSection = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
if (unityConfigurationSection != null)
{
    try
    {
        unityConfigurationSection.Configure(_container);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

строка unityConfigurationSection.Configure(_container); - это то, что меня вводит. Я получаю:

The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)

Похоже, есть тип, который не может быть определен по его имени, судя по трассировке стека.

Но как мне выяснить какой тип?

1 Ответ

0 голосов
/ 20 мая 2018

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

Обычно сообщение об исключении включает сборку, которую не удалось разрешить.Например, этот код выдает точное исключение:

var asm = Assembly.Load("test,,;''");

Это явно недопустимое имя сборки, поэтому вы получаете:

System.IO.FileLoadException: 'Не удалось загрузить файл илисборка "test \, \ ,;" "или одна из ее зависимостей.Указанное имя сборки или кодовая база недопустимы.(Исключение из HRESULT: 0x80131047) '

Я бы отладил код и посмотрел, можно ли получить сообщение об исключении.Одна вещь, которую я бы попробовал, это зайти в Сервис -> Параметры -> Отладка -> Включить только мой код и снять галочку.Это должно позволить вам увидеть развернутое исключение, которое выдается, когда Unity пытается разрешить зависимость.

Еще один быстрый способ - обработать событие AssemblyResolve.Всякий раз, когда сборка, которую искали по имени, не может быть разрешена по любой причине, по которой вызывается событие.Параметр args содержит имя сборки, которую пытались разрешить.

Поместите это как первую строку в вашей программе:

AppDomain.CurrentDomain.AssemblyResolve += Resolver;

, а затем поместите этот метод в тот же класс:

private static Assembly Resolver(object sender, ResolveEventArgs args)
{
    string assemblyName = args.Name;
    throw new Exception(args.Name);
}

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

...