Unity IoC容器异常故障排除(“给定的程序集名称或代码库无效”)

时间:2018-05-20 18:40:18

标签: c# .net inversion-of-control unity-container

在我的代码库中,我已成功创建了一个容器,但在尝试配置时遇到异常:

_container = new UnityContainer();
var unityConfigurationSection = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
if (unityConfigurationSection != null)
{
    try
    {
        unityConfigurationSection.Configure(_container);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

unityConfigurationSection.Configure(_container);行就是我的目标。我得到了:

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

从堆栈跟踪判断,看起来有一种类型无法通过其名称解析。

但是我如何找出什么类型?

1 个答案:

答案 0 :(得分:0)

该异常表示请求的程序集名称在某种程度上无法解析和查找。如果程序集名称有效但未找到,则会收到其他错误。

通常,异常消息包含无法解析的程序集。 例如,此代码抛出确切的异常:

var asm = Assembly.Load("test,,;''");

这显然不是有效的程序集名称,因此您得到:

System.IO.FileLoadException:'无法加载文件或程序集'" test \,\,;''"''或其中一个依赖项。给定的程序集名称或代码库无效。 (HRESULT异常:0x80131047)'

我调试代码并查看是否可以获取异常消息。 我尝试的一件事是进入工具 - >选项 - >调试 - >启用“仅我的代码”并删除复选标记。这可以让你看到当Unity试图解决依赖关系时抛出的解包异常。

另一种快速方法是处理AssemblyResolve事件。每当通过名称查找的程序集因为调用Event而无法解决的任何原因时都无法解析。 args参数包含尝试解析的程序集的名称。

将此作为您计划的第一行:

AppDomain.CurrentDomain.AssemblyResolve += Resolver;

然后将此方法放入同一个类:

private static Assembly Resolver(object sender, ResolveEventArgs args)
{
    string assemblyName = args.Name;
    throw new Exception(args.Name);
}

现在您可以设置断点并查看试图解析的程序集的名称。