2

我正在从 MSTest(作为 STA 线程)启动 WPF 应用程序。我在程序集初始化中启动应用程序并等待它完成加载。当我手动关闭主窗口(从测试中打开)和在程序集清理(自动方式)中关闭它时,在程序集清理方法完成后,我总是得到COM object that has been separated from its underlying RCW cannot be used, only in test debug异常。我试图等待 GC 完成并 Dispatcher.CurrentDispatcher.InvokeShutdown();按照类似线程中的建议调用清理,但没有运气。

请注意,在实际测试用例中,我没有做任何事情,因为我想最小化场景并确保仅通过打开和关闭应用程序来引发此异常。当然,当我只是手动运行应用程序而不是从测试中运行时,关闭窗口时不会出现任何异常。

还有其他建议可以防止这种情况吗?

当运行并且没有调试我的测试时,执行成功完成并且VS可以继续运行下一个计划项目的测试(与启动应用程序无关)。

堆栈跟踪

PresentationCore.dll!System.Windows.Input.TextServicesContext.StopTransitoryExtension() 

PresentationCore.dll!System.Windows.Input.TextServicesContext.Uninitialize(bool appDomainShutdown)  

WindowsBase.dll!MS.Internal.ShutDownListener.HandleShutDown(object sender, System.EventArgs e)  


复制

  • 创建新的 C# WPF .NET Framework 解决方案(例如。WpfApp1
  • 在自动生成的MainWindow.xaml添加一个简单的空网格
<Window x:Class="WpfApp1.MainWindow"
               xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
       mc:Ignorable="d"
       Title="MainWindow" Height="450" Width="800">
   <Grid>
   </Grid>
</Window>
  • Program.cs使用以下代码添加文件:
public static class Program
   {
       [STAThread]
       public static void Startup()
       {
           var window = new MainWindow();
           window.Show();
           window.Close();
       }
   }
  • 在解决方案中创建一个 C# MSTest 项目(例如。UnitTestProject1
  • 在 MSTest 项目中添加 WPF 项目作为引用
  • 在单元测试类中添加以下代码
[TestClass]
   public class UnitTest1
   {
       [AssemblyInitialize]
       public static void Initialize(TestContext _)
       {
           var mainThread = new Thread(() =>
           {
               WpfApp1.Program.Startup();
           });
           mainThread.SetApartmentState(ApartmentState.STA);
           mainThread.Start();
           mainThread.Join();
       }

       [TestMethod]
       public void TestMethod1()
       {
       }
   }
  • 调试TestMethod1
4

1 回答 1

0

Dispatcher.CurrentDispatcher.InvokeShutdown();需要在mainThread(调用后WpfApp1.Program.Startup();)内被调用

于 2021-01-07T14:54:38.397 回答