2

我正在开发一个必须安装在 GAC 中的程序集,作为构建后步骤的一部分,我确保 GAC 在每次构建后都得到更新。如果我创建一个(Visual Studio)单元测试(在单独的测试程序集中)以在被测类上调用新方法,然后在被测类上实现该方法(TDD 样式),然后运行测试(CTRL R, T) 被测程序集和单元测试项目被构建(并且程序集在 GAC 中更新)。

测试失败(为新方法抛出 System.MissingMethodException)。如果我现在调试测试,测试通过,然后我可以运行测试,它会通过。

作为我调查的一部分,我在测试中添加了一个无限循环,然后运行它。我使用 Process Explorer 来查找在测试期间加载的 dll 的路径。我发现在 C:\WINDOWS\assembly\temp\4XY349E7C5 中有一个程序集的句柄。使用我在此处找到的技巧查看该目录,我发现我的 dll 版本比 GAC 中的旧版本,如果我使用 Reflector 检查 dll,我发现它不包含我添加的新方法,它解释了 MissingMethodException。

那么为什么 VSTestHost.exe 会在 temp 目录中加载 dll,我有什么方法可以确保使用正确的 dll 吗?

4

1 回答 1

2

阅读本文指出了问题的原因 - VSTestHost.exe 保持加载版本的程序集(即 gac\temp 文件夹中引用的版本,当 VSTestHost 退出时,融合将卸载)。

该问题的解决方案是更改工具/选项/测试工具/测试执行中的设置 - 取消选中“保持测试执行引擎在测试之间运行”。现在 VSTestHost 为每个测试运行启动一个新实例,并从 GAC 加载我的 dll 的正确版本。

于 2010-01-27T10:51:42.630 回答