2010-10-17 2 views
12

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

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

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

Зависимости (В сборке под названием «Entities »В проекте: -. лиц)

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 )

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

ответ

14

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

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

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

Log

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

+4

К сожалению, у меня есть эта же проблема, получаю то же сообщение об ошибке, но журнал Fusion не показывает никаких ошибок :( – CodingWithSpike

+3

Убедитесь, что это что-то показывать! Это может быть немного утомительно для настройки, и процесс, необходимый для загрузки сборок, должен быть перезапущен после применения параметров в FusionLog. –

6

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

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

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

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

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

+0

Нужно ли устанавливать сборку в GAC, чтобы настроить ее в app.config? знаете, где искать? – Arcadian

3

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

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

+0

Я на Unity 2.1.5, и я все еще получаю эту ошибку без каких-либо подробностей и без регистрации Fusion с библиотекой C++/CLI смешанного режима. – MultiMat

0

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

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

18

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

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

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

Assembly.Load("MyAssembly"); 

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

+8

O r используйте 'Assembly.LoadFrom' с контуром. –

+0

@ RomanReiner спас меня так много времени! –

+0

@RomanReiner Спасибо –

0

работает как это

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") 
Смежные вопросы