InvalidCastException:RPC_E_CANTCALLOUT_ININPUTSYNCCALL

InvalidCastException:RPC_E_CANTCALLOUT_ININPUTSYNCCALL,exception,com,Exception,Com,我正在用C#构建一个应用程序,它有一个静态类,该类启动一个COM类,并处理另一个钩住键盘的类的一些事件处理程序。 当我从WPF窗口中的按钮事件处理程序调用COM类的方法时,该方法可以正常工作,但当我在静态类中的一个事件回调中调用它时,它会引发以下异常: 无法将“BLAHBLAH”类型的COM对象强制转换为接口类型 “布拉布拉”。此操作失败,因为上的QueryInterface调用 与IID接口的COM组件 “{9DD6680B-3EDC-40DB-A771-E6FE4832E34A}”由于以下原

我正在用C#构建一个应用程序,它有一个静态类,该类启动一个COM类,并处理另一个钩住键盘的类的一些事件处理程序。 当我从WPF窗口中的按钮事件处理程序调用COM类的方法时,该方法可以正常工作,但当我在静态类中的一个事件回调中调用它时,它会引发以下异常:

无法将“BLAHBLAH”类型的COM对象强制转换为接口类型 “布拉布拉”。此操作失败,因为上的QueryInterface调用 与IID接口的COM组件 “{9DD6680B-3EDC-40DB-A771-E6FE4832E34A}”由于以下原因失败 错误:由于应用程序不可用,无法进行传出呼叫 发送输入同步呼叫。(HRESULT的例外情况: 0x8001010D(RPC_E_CANTCALLOUT_ININPUTSYNCCALL))

你能告诉我这个异常是什么意思吗?我怎样才能解决它?

请参考这个知识库 看起来是因为线程(可能不是用户定义的线程)

请参阅此知识库
看起来这是因为线程(可能不是用户定义的线程)

将代码包装到新线程中:

Thread thread = new Thread(() =>
{
    ManagementObjectSearcher theSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
    foreach (ManagementObject currentObject in theSearcher.Get())
    {
        Debug.WriteLine("Device present: " + currentObject);          
        ManagementObject theSerialNumberObjectQuery = new ManagementObject("Win32_PhysicalMedia.Tag='" + currentObject["DeviceID"] + "'");
        serial = theSerialNumberObjectQuery["SerialNumber"].ToString();
    }
});
thread.Start();
thread.Join(); //wait for the thread to finish

将代码包装到新线程中:

Thread thread = new Thread(() =>
{
    ManagementObjectSearcher theSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
    foreach (ManagementObject currentObject in theSearcher.Get())
    {
        Debug.WriteLine("Device present: " + currentObject);          
        ManagementObject theSerialNumberObjectQuery = new ManagementObject("Win32_PhysicalMedia.Tag='" + currentObject["DeviceID"] + "'");
        serial = theSerialNumberObjectQuery["SerialNumber"].ToString();
    }
});
thread.Start();
thread.Join(); //wait for the thread to finish