Unity application block 2.0 - указанное имя сборки или кодовая база были недействительными - PullRequest
13 голосов
/ 17 октября 2010

Интерфейсы (В сборке под названием «Интерфейсы». В проекте: - Интерфейсы)

namespace Interfaces
{
    public interface IDoSomeWork1
    {
        string DoSomeWork1();
    }
}

namespace Interfaces
{
    public interface IDoSomeWork2
    {
        string DoSomeWork2();
    }
}

Зависимости (В сборке под названием «Объекты». В проекте:- сущности)

namespace Entities
{
    public class ClassB : IDoSomeWork1
    {
        public string DoSomeWork1()
        {
            return this.ToString();
        }
    }
}

namespace Entities
{
    public class ClassC : IDoSomeWork2
    {
        public string DoSomeWork2()
        {
            return this.ToString();
        }
    }
}

Класс (в проекте: - UsingUnity)

public class ClassA
    {
        [Dependency]
        public IDoSomeWork1 DoSomeWork1 { get; set; }
        [Dependency]
        public IDoSomeWork2 DoSomeWork2 { get; set; }


        public void SomeMethodInClassA()
        {
            Console.WriteLine(DoSomeWork1.DoSomeWork1());
            Console.WriteLine(DoSomeWork2.DoSomeWork2());
        }
    }

App.Config (в проекте консольного приложения: - ConsoleUsingUnity)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="unity"
                 type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
                   Microsoft.Practices.Unity.Configuration" />
    </configSections>
    <unity>
        <containers>
            <container>
                <types>
                    <type type="Interfaces.IDoSomeWork1, Interfaces"
                          mapTo="Entities.ClassB, Entities" />
                    <type type="Interfaces.IDoSomeWork2, Interfaces"
                          mapTo="Entities.ClassC, Entities" />
                </types>
            </container>
        </containers>
    </unity>
</configuration>

Клиент (В проекте консольного приложения: - ConsoleUsingUnity)

public class Class1
    {
        static void Main(string[] args)
        {
            IUnityContainer container = new UnityContainer();

            // Load from config file
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            section.Configure(container);

            ClassA classA = container.Resolve<ClassA>();
            classA.SomeMethodInClassA();
        }
    }

И когда я запускаю клиент,В разделе section.Configure (контейнер) я получаю следующую ошибку: -

Указанное имя сборки или кодовая база недопустимы.(Исключение из HRESULT: 0x80131047)

Я не уверен, что с конфигом или типом что-то не так.Может ли кто-нибудь указать здесь на ошибку?

Ответы [ 7 ]

19 голосов
/ 05 июня 2014

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

Assembly.Load("C:\\Program Files\\MyProgram\\MyAssembly.dll");

После множества проб и ошибок я понял, что вы не должны проходить путь, и вы, конечно, не должнывключает .dll расширение.Следующее исправило мою проблему:

Assembly.Load("MyAssembly");

Надеюсь, это поможет кому-то еще рано или поздно!

15 голосов
/ 17 октября 2010

Прежде чем ответить на мой вопрос, я должен заявить, что приведенный выше код не доставил мне никаких проблем (ошибка сборки и т. Д.). Это просто дало мне ошибку, которую я указал в своем вопросе. Проблема с Unity на данный момент заключается в том, что он не предоставляет, какая сборка или какие типы в сборке не могут быть загружены. Это запрашиваемая функция .

В моем случае это была проблема с отсутствующей сборкой. Я не ссылался на сборку сущностей в проекте клиентского приложения. Похоже, что сборка «Entities» могла быть разрешена только во время выполнения (так как она не давала мне никакой ошибки во время компиляции). Однако ошибка во время выполнения также не была полезной.

Я посмотрел Fusion Log Viewer (он должен быть в папке .NET SDK). Какая жемчужина полезности это. Он может регистрировать все виды привязок сборки (все или только сбои) и дает очень точное описание того, какая сборка не может быть загружена. Очень полезно! FailedToLoadAssemblyDetected

Log

Итак, в следующий раз вы получите сообщение об ошибке «Указанное имя сборки или кодовая база неверна», попробуйте Fusion Log Viewer. Это не поможет вам найти, какие типы не могут быть загружены. Однако, по крайней мере, вы будете уверены, что все ваши сборки загружаются правильно.

6 голосов
/ 17 августа 2011

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

 AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
3 голосов
/ 06 ноября 2012

Теперь есть лучший способ! Unity имеет новую версию (в настоящее время 2.1.505.2), которая четко сообщает подробности и позволяет сразу же приступить к ее изучению.

Вы можете найти двоичные файлы и источник здесь: http://unity.codeplex.com/releases

0 голосов
/ 05 апреля 2016

работает так

Dim dllData = System.IO.File.ReadAllBytes(dllFullPath)
Dim asb As System.Reflection.Assembly

asb = System.Reflection.Assembly.Load(dllData)

Dim cls As Object = asb.CreateInstance("namespace.class")
0 голосов
/ 07 марта 2013

Пожалуйста, убедитесь, что вы добавили ссылки на сборки отсутствующей сборки в проект, где существует ваш файл web.config.

Я пропустил это.Я уже добавил эти ссылки на сборки в проект, который использовал Unity для разрешения класса, но пропустил его добавление в родительский проект, где находился файл конфигурации.Это решило мою проблему.

0 голосов
/ 23 февраля 2012

Я обнаружил, что наименее трудоемким методом поиска, который Type не удалось связать, является следующий:

  1. Перейти к разделу Источники на странице Unity в codeplex http://unity.codeplex.com/SourceControl/list/changesets
  2. Выберите версию и загрузите исходные коды
  3. Сборка DEBUG версии Unity и Unity.Configuration (если в вашем проекте используется больше сборок Unity, также создайте их)
  4. Удалитьссылки на единство в вашем проекте и добавьте ссылки на сборки из шага 3
  5. В Visual Studio перейдите на Debug > Exceptions и убедитесь, что Common Language Runtime Exceptions имеет флажок в столбце Thrown.

А теперь иди и разбей эту штуку.Выполнение остановится в методе Unitys TypeResolverImpl.SearchAssemblies, а параметр typeNameOrAlias будет содержать ответ!

...