C# Visual Studio 2017-消息筛选器表示应用程序正忙

C# Visual Studio 2017-消息筛选器表示应用程序正忙,c#,.net,visual-studio,visual-studio-2017,envdte,C#,.net,Visual Studio,Visual Studio 2017,Envdte,我正在移植一个小型控制台应用程序,该应用程序删除磁盘上不在VisualStudio项目中的文件。此代码在Visual Studio 2013中运行,但在Visual Studio 2017中运行时收到以下错误: System.Runtime.InteropServices.COMException:'消息筛选器 表示应用程序正忙。HRESULT的例外情况: 0x8001010A RPC_E_服务器调用_RETRYLATER' 当前代码: 此时会引发异常!dte.Solution.IsOpen线。

我正在移植一个小型控制台应用程序,该应用程序删除磁盘上不在VisualStudio项目中的文件。此代码在Visual Studio 2013中运行,但在Visual Studio 2017中运行时收到以下错误:

System.Runtime.InteropServices.COMException:'消息筛选器 表示应用程序正忙。HRESULT的例外情况: 0x8001010A RPC_E_服务器调用_RETRYLATER'

当前代码:

此时会引发异常!dte.Solution.IsOpen线。我试着把它注释掉,然后它被抛出到dte.Solution.Projects行中的foreach项目中

注:

代码基于此。我希望将其保存在控制台应用程序中。 我找到了PowerShell和VS插件/扩展,但我有兴趣在控制台应用程序中保留这个名为的C类。 我尝试只使用EnvDTE,而不是EnvDTE80,但收到了相同的错误。
使用注册的IOleMessageFilter的实现必须在STA单元线程中

从CoRegisterMessageFilter函数文档中:

每个线程只能注册一个消息筛选器。穿入 多线程单元不能有消息筛选器

您的问题表明您正在通过一个小型控制台应用程序进行移植,并表明您正在使用C。我不知道移植到底意味着什么,但若原始代码是在VB.Net中,VB.Net会自动将控制台应用程序标记为C不在何处,因此线程是在MTA线程中创建的

在C中,将属性应用于entry方法Main,如下所示

namespace ConsoleApp1
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
        }
    }
}

使用注册的IOleMessageFilter的实现必须在STA单元线程中

从CoRegisterMessageFilter函数文档中:

每个线程只能注册一个消息筛选器。穿入 多线程单元不能有消息筛选器

您的问题表明您正在通过一个小型控制台应用程序进行移植,并表明您正在使用C。我不知道移植到底意味着什么,但若原始代码是在VB.Net中,VB.Net会自动将控制台应用程序标记为C不在何处,因此线程是在MTA线程中创建的

在C中,将属性应用于entry方法Main,如下所示

namespace ConsoleApp1
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
        }
    }
}

DTE实例似乎很忙。有没有办法在使用前检查它是否准备好了?在while循环之前,您是否尝试过访问它?我尝试过删除while循环,并在使用它的下一行收到了相同的消息。我还尝试在解决方案关闭的情况下运行exe,同样的错误。您是否记得将Main方法的属性设置为[StatThread]?我没有该属性,如果没有它,它在VS2013中会工作吗?我所看到的IOleMessageFilter的每个实现都表明它是必需的,并且您的链接还声明:要执行此操作,在单线程单元STA中从Visual Studio应用程序启动新线程,并使用IOleMessageFilter处理程序围绕自动化代码。C控制台应用程序默认为MTA。DTE实例似乎正忙。有没有办法在使用前检查它是否准备好了?在while循环之前,您是否尝试过访问它?我尝试过删除while循环,并在使用它的下一行收到了相同的消息。我还尝试在解决方案关闭的情况下运行exe,同样的错误。您是否记得将Main方法的属性设置为[StatThread]?我没有该属性,如果没有它,它在VS2013中会工作吗?我所看到的IOleMessageFilter的每个实现都表明它是必需的,并且您的链接还声明:要执行此操作,在单线程单元STA中从Visual Studio应用程序启动新线程,并使用IOleMessageFilter处理程序围绕自动化代码。C控制台应用程序默认为MTA。