【问题标题】:How can it be that .Net cannot find the System assembly?.Net 怎么会找不到系统程序集?
【发布时间】:2013-11-19 23:32:12
【问题描述】:
我在执行一些集成测试时遇到以下错误:
显示名称为“System”的程序集未能在 ID 为 4 的 AppDomain 的“Load”绑定上下文中加载。失败的原因是:System.IO.FileNotFoundException:无法加载文件或程序集“System, Culture=neutral, PublicKeyToken=b77a5c561934e089' 或其依赖项之一。系统找不到指定的文件。
这些测试过去可以工作,我不知道怎么会找不到这样一个基本的dll。此外,系统程序集已经加载:
顺便说一句,执行的代码正在创建 AppDomain 以执行集成测试,以防万一。
编辑:看起来我们已经安装了所需的框架:
【问题讨论】:
标签:
.net
integration-testing
appdomain
assembly-resolution
【解决方案1】:
当测试环境没有安装目标框架时,可能会发生此错误。特别是当您使用后期绑定时。如果您使用的是 IOC/DI,可能就是这种情况。
请注意,也可能导致(由于后期绑定)需要其他(额外).NET 版本。如果程序中使用的组件之一是针对 .NET 2.0 编译的,则可能还需要安装该框架版本。
【解决方案2】:
当您的应用程序针对的 DotNet 框架版本与您正在测试的机器上安装的版本不同时,可能会发生这种情况。我注意到所需的所有这些程序集都是 4.0,但看起来您正在显示 VS2012+ 中模块窗口的输出,因此很可能安装了 4.0。
接下来,我们查看运行集成测试的运行时环境。因为在 DotNet 中,用于所有程序集加载的框架版本由初始可执行文件定义。通常这不是问题,因为如果您使用 4.0 exe,并参考 2.0 框架,那么通常可以替换新的。但是,如果您运行 2.0 版本,那么它将无法解析 4.0 程序集。
如果您使用的是 NUnit,那么您可以使用一些技巧来帮助我解决这个问题。 http://nunit.org/index.php?p=runtimeSelection&r=2.6.3
【解决方案3】:
我终于找到了问题:app.config 由于“太宽”的搜索和替换而损坏,似乎这是奇怪的系统负载的罪魁祸首。