Unity application block 2.0 - The given assembly name or codebase was invalid

13

Interfaces (In the assembly named "Interfaces". In project :- Interfaces)

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

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

Dependencies (In the assembly named "Entities". In project :- 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();
        }
    }
}

Class (In project :- 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 (In a console application project :- 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>

The client (In a console application project :- 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();
        }
    }

And when I run the client, I get the following error at section.Configure(container);:-

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

I am not sure If there is anything wrong with the config or the type. Could anyone please point out the mistake here?

c#
unity-container
enterprise-library
asked on Stack Overflow Oct 17, 2010 by Ashish Gupta • edited Oct 17, 2010 by Ashish Gupta

7 Answers

19

In case anyone else ever has the same problem - I was also getting this error but had a slightly different problem. I was trying to load an assembly that clearly existed like the following:

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

After lots of trial and error I figured out that you aren't supposed to pass the path and you certainly aren't supposed to include .dll extension. The following fixed my issue:

Assembly.Load("MyAssembly");

Hopefully that helps someone else sooner or later!

answered on Stack Overflow Jun 5, 2014 by drew_w
15

Before I answer my question, I must state that the code posted above didn't give me any problem (build error etc.). It just gave me the error I stated in my question. The problem with Unity at this point of time is that It does not provide which assembly or a which types in the assembly could not be loaded. This is a requested feature.

In my case It was a missing assembly problem. I didn't reference Entities assembly in to the client application project. It seems that that "Entities" assembly could be resolved only at the run-time (since it didn't give me any compile time error). However, the run-time error was also not useful at all.

I had a look a Fusion Log viewer (It should be in the .NET SDK folder). What a gem of an utility It is. It can log all kind of assembly bindings (all or only failures) and It give a very neat description of which assembly could not load. Very helpful! FailedToLoadAssemblyDetected

Log

So, next time, you get this "The given assembly name or codebase was invalid" error, try Fusion Log Viewer. It wont help you in finding which types couldn't be loaded. However,at least you will be sure all your assemblies are getting loaded correctly.

answered on Stack Overflow Oct 17, 2010 by Ashish Gupta
6

If you connect up the domain AssemblyResolve event you can get the assembly that has failed to bind.

 AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
answered on Stack Overflow Aug 17, 2011 by PaulB
3

There is a better way now! Unity has a new version (currently 2.1.505.2) which clearly reports the details and lets you get to the bottom of it immediately.

You can find binaries and source here: http://unity.codeplex.com/releases

answered on Stack Overflow Nov 6, 2012 by Mazrick
0

I found that the least time consuming method of finding which Type exactly failed to bind is the following:

  1. Go to Sources section of Unity page at codeplex http://unity.codeplex.com/SourceControl/list/changesets
  2. Select a version and download the sources
  3. Build DEBUG version of Unity and Unity.Configuration (if your project uses more of unity assemblies, build them as well)
  4. Remove references to unity from your project and add references to assemblies from step 3
  5. In Visual Studio go to Debug > Exceptions and make sure Common Language Runtime Exceptions has a checkbox in the Thrown column.

Now go crash that thing. Execution will stop in Unitys' TypeResolverImpl.SearchAssemblies method and typeNameOrAlias parameter will hold the answer!

answered on Stack Overflow Feb 23, 2012 by mdonatas • edited Feb 23, 2012 by mdonatas
0

Please make sure, that you have added assembly references of the missing assembly in the project where your web.config file exists.

I was missing this. I already have added those assembly references in the project which was using Unity to resolve the class, but missed to add it in the parent project where configuration file was located. This has resolved my problem.

answered on Stack Overflow Mar 7, 2013 by user1451020 • edited Sep 14, 2016 by shamp00
0

works like this

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")
answered on Stack Overflow Apr 4, 2016 by FERV

User contributions licensed under CC BY-SA 3.0