C# &引用;句柄无效";Visual Studio 2015测试运行程序中出现异常

C# &引用;句柄无效";Visual Studio 2015测试运行程序中出现异常,c#,.net,visual-studio,unit-testing,visual-studio-2015,C#,.net,Visual Studio,Unit Testing,Visual Studio 2015,我发现我在VS2013中通过的一个测试在VS2015中失败,该测试调用了一个服务,其中包括对Console.Clear()的调用 为了找出发生了什么,我做了一个简单的单元测试 [TestMethod] public void ExampleTest() { Console.Clear(); } 此测试在visual studio 2013中通过,但在2015年我得到以下错误: 测试名称:ExampleTest 测试全名:solution.Commo

我发现我在VS2013中通过的一个测试在VS2015中失败,该测试调用了一个服务,其中包括对
Console.Clear()的调用

为了找出发生了什么,我做了一个简单的单元测试

   [TestMethod]
    public void ExampleTest()
    {
        Console.Clear();
    }
此测试在visual studio 2013中通过,但在2015年我得到以下错误:

测试名称:ExampleTest 测试全名:solution.Common.Test.CacheManagerTest.ExampleTest 测试源:C:\solution.Common.Test\CacheManagerTest.cs:第34行 测试结果:失败 测试持续时间:0:00:00.3015003

结果StackTrace:at System.IO.\u Error.WinIOError(Int32 errorCode, System.Console.GetBufferInfo(布尔值)中的字符串maybeFullPath 在System.Console.Clear()上的throwOnNoConsole、Boolean和successed) 在中的sol.Common.Test.CacheManagerTest.ExampleTest()处 C:\solution.Common.Test\CacheManagerTest.cs:第35行结果消息:
试验方法Alexandria.Common.Test.CacheManagerTest.ExampleTest 异常:System.IO.IOException:句柄无效

我明白,如果我的服务没有被控制台调用,那么失败是一种糟糕的设计。我问这个问题的原因是为了理解为什么在新版本的Visual Studio中失败。这是故意的行为吗?什么改变了

我在变更日志中没有看到任何明显的与此相关的内容

编辑:我正在从以下dll调用Console.clear

Microsoft\Framework.NETFramework\v4.5.1\mscorlib.dll

编辑2:

两个visual Studio中的testproject属性图片

VS2015中的更改非常明显,请使用“测试>调试>所有测试”来获取详细信息。您可以看到,它现在有一个新的测试主机进程,其名称为
TE.ProcessHost.Managed.exe
,存储在C:\Program Files(x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow目录中

以前版本的VS使用了不同的主机vstest.executionengine.exe。新测试主机的一个显著变化是它不再是控制台模式程序。通过在exe上运行Dumpbin.exe/headers可以看到一些内容

查看潜在问题的另一种方法是使用任务管理器。请注意,在较旧的VS版本中运行测试如何导致添加
conhost.exe
进程。这是拥有控制台模式应用程序控制台窗口的进程。我以前见过的一个问题是,这个过程倾向于泄漏,而不是在测试完成时终止。添加了更多的conhost.exe实例,在研究这个问题时,我有12个实例正在运行。VS2015的变化大概是为了解决这个问题

从技术上讲,您可以使用配置单元测试,并使用
元素强制使用旧的测试主机进程。然而,这对测试结果没有影响,看起来他们以多种方式解决了这个问题

这是相当多的猜测,我建议您使用connect.microsoft.com来提交反馈报告。你可以引用这个Q+A作为参考


同时,你可以考虑解决办法。请注意,

Console.Clear()
通常是一个麻烦制造者,当控制台模式应用程序的输出被重定向时,它在正常使用中也会失败。使用
操作符从命令行提示符执行此操作非常简单。这是它在单元测试中失败的最终原因。您需要使代码具有弹性,以便它能够在生产和单元测试中正常工作。像这样:

    if (!Console.IsOutputRedirected) Console.Clear();

这需要以.NET 4.5或更高版本为目标。如果需要针对早期版本,可以使用中的代码。

否。对我来说,这在VisualStudio2010上失败了。可以在VS2013中双击项目,选择属性->选择应用程序选项卡->检查输出类型。上面写的是类库吗?@gideon是的,这是一个类库,我使用的是Microsoft Visual Studio Professional 2013版本12.0.31101.00 Update 4Wow,这太奇怪了。它应该会中断,因为当它是类库时,没有可用的控制台。它能正常工作吗?请清除控制台?@mmilan在测试项目中使用了什么.net framework?在.net 4.5中,
console.clear()
使用
console.GetBufferInfo()
而不是
console.GetBufferInfo(布尔throwonnonsole,Boolean&succeed)
作为调用堆栈。@gideon我还没有找到一种方法来实际检查它是否清除了控制台。对我来说,在Vs2013中通过测试毫无意义,但确实如此。