Подтвердить что ты не робот

Блок приложения Unity 2.0 - данное имя сборки или кодовая база недействительны.

Интерфейсы (в сборке с именем "Интерфейсы". В проекте: - Интерфейсы)

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();
        }
    }

И когда я запускаю клиент, я получаю следующую ошибку в разделе. Конфигурация (контейнер);:

Данное имя сборки или кодовая база недействительно. (Исключение из HRESULT: 0x80131047)

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

4b9b3361

Ответ 1

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

В моем случае Это была недостающая проблема сборки. Я не ссылался на Entities assembly в проект клиентского приложения. Кажется, что эта сборка "Сущности" может быть решена только во время выполнения (поскольку она не давала мне какой-либо ошибки времени компиляции). Однако ошибка времени выполнения также не была полезной.

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

Log

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

Ответ 2

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

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

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

Assembly.Load("MyAssembly");

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

Ответ 3

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

 AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

работает следующим образом

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")