C#例外 - 无法投类型的COM对象.....应用程序调用这是编组为一个不同的线程

问题描述:

这里的接口是我的代码的简化版本C#例外 - 无法投类型的COM对象.....应用程序调用这是编组为一个不同的线程

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.InteropServices; 
using RDSCOMMUNICATORLib; 
using System.Timers; 
using System.Threading; 

namespace RDSConsoleApplication 
{ 
    class Program 
    { 
    static public RDSComClass oObj = new RDSComClass(); 


    static void Main(string[] args) 
    { 
     try 
     { 
      oObj.Host = "127.0.0.1"; 
      oObj.Port = 2902; 

      oObj.LoadPiece(); // OK HERE 

      IConnectionEvents_OnPieceEventHandler PieceArraved = new IConnectionEvents_OnPieceEventHandler(oObj_OnPiece); 
      oObj.OnPiece += PieceArraved; 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine("{0} Exception caught.", e); 
     } 

    } // end main 


    static public void oObj_OnPiece(int lLSCRef, string strLSCName, int lPieceNumber, int bWithScans) 
    { 

     try 
     { 
      // HERE WE START GETTING EXCEPTION "Unable to cast COM object of type..... 
      // The application called an interface that was marshalled for a different thread" 
      oObj.LoadPiece(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("{0} Exception caught.", e); 
     } 

    } 

} // end class Program 
} // end namespace 

我引用一个COM C#控制台应用程序中的对象,它充当连接到后端的网关并定期接收一些“块”对象。作为一个测试,当我从主要方法中尝试所有工作正常:我可以连接,接收“片”对象并访问其属性。问题是我需要从oObj_OnPiece回调方法中接收和处理相同的“片段”对象,并且它会抛出上述异常。我浏览过其他类似的帖子,我知道这是一个线程问题,但不知道如何解决它。任何帮助表示赞赏。

+0

您可以尝试在Main上添加[STAThread]属性吗? https://*.com/questions/1361033/what-does-stathread-do –

+0

我做了,它只是阻止回调oObj_OnPiece被触发。我需要访问回调中的“块”对象。这里的问题是主方法和回调正在两个不同的线程上运行。如果我可以在单个线程上运行它们,但同时能够触发回调,那应该可以解决问题。 – user2217057

您尝试查询已在应用程序的其他线程中使用的接口。在你的情况下,你首先通过你的调用查询主线程中的接口。我想这是第一个线程。

事件处理程序是否可能打开不同的线程来处理事件?如果是这种情况(只需在您的事件处理程序中添加一个断点,然后尝试访问该接口,启动程序并检查是否有2个线程正在运行)。

你需要做的是:确保你只在一个线程中查询你的接口,方法是先除去对COM对象的第一个调用。

+0

我同意,但仅在一个线程中查询接口的问题是,在第一个线程oObj.OnPiece + = PieceArraved中存在对事件的依赖关系。这是周期性触发回调的时候。同时,我需要在回调中访问oObj的一些属性以进一步处理。 – user2217057

+0

怎样为com对象定义一个线程并通过调度器进行通信? – KimKulling