VS2012测试资源管理器锁定本机.dll,使重建失败

Wil*_*ert 24 c# c++-cli visual-studio visual-studio-2012 test-explorer

我使用Visual Studio 2012作为C#和C++/CLI .dll的解决方案,C++/CLI dll引用本机.dll,例如boost.C++代码编译为x64.

当我打开VS时,我可以清理并构建我的项目.

使用测试资源管理器,我可以运行我的测试.

一旦我使用测试资源管理器运行测试一次,我就无法重建项目.似乎VS2012 Test Explorer对我的C++/CLI-dll保持锁定,并且在那里我收到以下错误:

LNK1104: cannot open file 'C:\Dev\LockExample\bin\Debug\cli.dll'
Run Code Online (Sandbox Code Playgroud)

因此,每当我使用Test Explorer运行测试时,我需要重新启动VS2012才能继续开发.显然,这不是一个可持续发展的过程.

测试和重建工作没有问题C#-only dll - 只要我能告诉问题只发生在使用本机x64代码的DLL上.

经过一些测试,我发现这里的反派是vstest.executionengine.exe.使用句柄(来自SysInternals),我看到vstest.executionengine.exe保存了.dll和cli-dll的.pdb的锁.对于托管专用dll,它没有任何锁定.

在测试运行完成后,如何让Visual Studio Test Explorer释放C++/Cli dll上的锁?

小智 30

在Visual Studio 2013中,通过取消选中菜单中"测试 - >测试设置"下的"保持测试执行引擎运行"选项,可以轻松解决此问题.

我在另一篇文章中找到了答案: vstest.executionengine.x86.exe没有关闭


Wil*_*ert 9

经过一些搜索,我在connect.microsoft.com上发现了这篇文章.解决问题的最后一个提示确实解决了问题,尽管这是一个丑陋的黑客攻击.

如果我将以下内容添加到我的C++/CLI dll中,我可以重建:

taskkill /F /IM vstest.executionengine.exe /FI "MEMUSAGE gt 1"
taskkill /F /IM vstest.executionengine.x86.exe /FI "MEMUSAGE gt 1"
Run Code Online (Sandbox Code Playgroud)

这将终止vstest.executionengine.exe进程,从而释放我的.dll文件上的锁.