在我的代码库中,我已成功创建了一个容器,但在尝试配置时遇到异常:
_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)
从堆栈跟踪判断,看起来有一种类型无法通过其名称解析。
但是我如何找出什么类型?
答案 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);
}
现在您可以设置断点并查看试图解析的程序集的名称。