2010-01-08 40 views
2

我正在开发一个必须安装在GAC中的程序集,并且作为构建后步骤的一部分,我确保在每次构建之后GAC都会得到更新。如果我创建一个(Visual Studio)单元测试(在一个单独的测试程序集中)调用被测试类的新方法,然后在被测试类(TDD样式)上实现该方法,然后运行运行测试(CTRL R,T)待测组件和单元测试项目建立(并且程序集在GAC中进行更新)。为什么VSTestHost.exe从c: windows assembly temp目录加载程序集?

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

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

那么,为什么VSTestHost.exe加载临时目录中的DLL,并有一些方法可以确保使用正确的DLL?

回答

2

阅读本article指出我朝着该问题的原因 - VSTestHost.exe是保持版本加载的程序集(即在GAC \ temp文件夹,它融合将卸载VSTestHost退出时refered的版本)。

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

+0

我有一个类似的问题与SharePoint和OWSTIMER-问题是它很难重新启动OWSTIMER服务比它是VSTest。 http://stackoverflow.com/questions/5047694/sharepoints-owstimer-service-keeping-references-to-feature-receiver-assemblies – Ryan

相关问题