Unity应用程序块2.0 - 给定的程序集名称或代码库无效

时间:2010-10-17 05:09:48

标签: c# unity-container enterprise-library

接口(在名为“Interfaces”的程序集中。在项目中: - 接口)

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(container);得到以下错误: -

  

给定的程序集名称或代码库   无效。 (HRESULT的例外情况:   0x80131047)

我不确定配置或类型是否有任何问题。有人可以指出这里的错误吗?

7 个答案:

答案 0 :(得分:19)

如果其他人遇到同样的问题 - 我也遇到了这个错误,但问题略有不同。我试图加载一个明显存在的组件,如下所示:

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

经过大量的反复试验后,我发现你不应该通过这条路,你当然不应该包括.dll扩展名。以下解决了我的问题:

Assembly.Load("MyAssembly");

希望迟早会帮助别人!

答案 1 :(得分:15)

在我回答我的问题之前,我必须说明上面发布的代码没有给我任何问题(构建错误等)。它只是给了我在我的问题中所说的错误。 Unity在这个时间点的问题是它没有提供哪个程序集或程序集中的哪些类型无法加载。这是requested feature

在我的情况下这是一个缺少装配问题。我没有将实体程序集引用到客户端应用程序项目中。似乎“实体”程序集只能在运行时解析(因为它没有给我任何编译时错误)。但是,运行时错误也没有用。

我看了一眼Fusion Log viewer(它应该在.NET SDK文件夹中)。它是一个实用工具的宝石。它可以记录所有类型的程序集绑定(全部或仅故障),并且它给出了无法加载哪个程序集的非常简洁的描述。很有帮助! FailedToLoadAssemblyDetected

Log

因此,下次,您会收到“给定的程序集名称或代码库无效”错误,请尝试使用Fusion Log Viewer。它不会帮助您找到无法加载的类型。但是,至少您将确保所有程序集都正确加载。

答案 2 :(得分:6)

如果您连接域AssemblyResolve事件,则可以获得无法绑定的程序集。

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

答案 3 :(得分:3)

现在有更好的方法! Unity有一个新版本(目前是2.1.505.2),它清楚地报告了细节,让你立即了解它。

您可以在此处找到二进制文件和来源:http://unity.codeplex.com/releases

答案 4 :(得分:0)

我发现找出哪个Type完全无法绑定的最省时的方法如下:

  1. 转到codeplex http://unity.codeplex.com/SourceControl/list/changesets
  2. 的Unity页面的“来源”部分
  3. 选择版本并下载资源
  4. 构建DEBUGUnityUnity.Configuration(如果您的项目使用更多的统一集合,也可以构建它们)
  5. 从项目中删除对unity的引用,并添加对第3步中的程序集的引用
  6. 在Visual Studio中,转到Debug > Exceptions并确保Common Language Runtime Exceptions列中的Thrown列中有一个复选框。
  7. 现在去崩溃了。执行将在Unitys的TypeResolverImpl.SearchAssemblies方法中停止,typeNameOrAlias参数将保留答案!

答案 5 :(得分:0)

请确保您在web.config文件所在的项目中添加了缺失程序集的程序集引用。

我错过了这个。我已经在使用Unity解析类的项目中添加了那些程序集引用,但是错过了将它添加到配置文件所在的父项目中。这解决了我的问题。

答案 6 :(得分: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")