2017-08-23 30 views
0

這裏的接口是我的代碼的簡化版本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://stackoverflow.com/questions/1361033/what-does-stathread-do –

+0

我做了,它只是阻止回調oObj_OnPiece被觸發。我需要訪問回調中的「塊」對象。這裏的問題是主方法和回調正在兩個不同的線程上運行。如果我可以在單個線程上運行它們,但同時能夠觸發回調,那應該可以解決問題。 – user2217057

回答

0

您嘗試查詢已在應用程序的其他線程中使用的接口。在你的情況下,你首先通過你的調用查詢主線程中的接口。我想這是第一個線程。

事件處理程序是否可能打開不同的線程來處理事件?如果是這種情況(只需在您的事件處理程序中添加一個斷點,然後嘗試訪問該接口,啓動程序並檢查是否有2個線程正在運行)。

你需要做的是:確保你只在一個線程中查詢你的接口,方法是先除去對COM對象的第一個調用。

+0

我同意,但僅在一個線程中查詢接口的問題是,在第一個線程oObj.OnPiece + = PieceArraved中存在對事件的依賴關係。這是週期性觸發回調的時候。同時,我需要在回調中訪問oObj的一些屬性以進一步處理。 – user2217057

+0

怎樣爲com對象定義一個線程並通過調度器進行通信? – KimKulling

相關問題