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

14

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

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

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

依赖项(在名为“Entities”的程序集中。在项目 :- 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();
        }
    }
}

类 (在项目中:- 使用Unity)

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个回答

20
如果其他人遇到相同的问题 - 我也曾遇到过这个错误,但是我的问题略有不同。我尝试加载一个明显存在的程序集,如下所示:
Assembly.Load("C:\\Program Files\\MyProgram\\MyAssembly.dll");

经过多次尝试,我发现你不应该传递路径,当然也不应该包含 .dll 扩展名。以下代码修复了我的问题:

Assembly.Load("MyAssembly");

希望这对其他人早晚能有所帮助!


12
或者使用Assembly.LoadFrom和路径。 - Roman Reiner

15
在回答问题之前,我必须声明上面发布的代码并没有给我任何问题(构建错误等)。它只是给了我我在问题中所述的错误。Unity在这个时间点的问题是它不提供不能加载哪个程序集或程序集中的哪些类型。这是一个被请求的功能
在我的情况下是缺少一个程序集。我没有将“Entities”程序集引用到客户端应用程序项目中。看起来“Entities”程序集只能在运行时解析(因为它没有给我任何编译时错误)。然而,运行时错误也没有任何帮助。
我看了一下Fusion Log Viewer(它应该在.NET SDK文件夹中)。它是多么有用的工具。它可以记录所有类型的程序集绑定(全部或失败)并且它非常清楚地描述哪个程序集无法加载。非常有帮助! FailedToLoadAssemblyDetected Log 因此,下次您遇到“给定的程序集名称或代码库无效”的错误时,请尝试使用Fusion Log查看器。它无法帮助您找到哪些类型无法加载。但是,至少您可以确定所有程序集都正确加载了。

4
很不幸,我也遇到了同样的问题,收到了相同的错误信息,但融合日志中没有显示任何错误 :( - CodingWithSpike
3
确保它显示了某些东西!设置可能有点繁琐,而且必须重新启动加载程序集的过程,在应用FusionLog设置后。 - Mladen Mihajlovic

6
如果连接了域AssemblyResolve事件,您可以获得未能绑定的程序集。
 AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

3
现在有更好的方法!Unity有一个新版本(当前版本是2.1.505.2),它清晰地报告了细节,让您立即找到问题的根源。
您可以在这里找到二进制文件和源代码:http://unity.codeplex.com/releases

我在使用 Unity 2.1.5,但是在一个“混合模式” C++/CLI 库中仍然遇到了这个错误,而且没有详细信息和 Fusion 日志。 - MultiMat

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

0
请确保您已经在包含web.config文件的项目中添加了缺失程序集的引用。
我之前就是这个问题。我已经在使用Unity解析类的项目中添加了这些程序集引用,但是忘记在父级项目中添加它们,而那里才是配置文件所在的位置。这解决了我的问题。

0

我发现找到哪个Type绑定失败的最省时方法如下:

  1. 前往Unity页面的Sources部分,位于codeplex http://unity.codeplex.com/SourceControl/list/changesets
  2. 选择一个版本并下载源代码
  3. 构建DEBUG版本的UnityUnity.Configuration(如果您的项目使用更多的Unity程序集,请一并构建)
  4. 从您的项目中删除对Unity的引用,并添加步骤3中的程序集引用
  5. 在Visual Studio中转到Debug > Exceptions,确保Common Language Runtime ExceptionsThrown列中有一个复选框。

现在去让它崩溃吧。执行将停止在Unity的TypeResolverImpl.SearchAssemblies方法中,typeNameOrAlias参数将给出答案!


我们需要将程序集安装到GAC中才能在app.config中进行配置吗?.net如何知道在哪里搜索? - Arcadian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接