這裏的接口是我的代碼的簡化版本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回調方法中接收和處理相同的「片段」對象,並且它會拋出上述異常。我瀏覽過其他類似的帖子,我知道這是一個線程問題,但不知道如何解決它。任何幫助表示讚賞。
您可以嘗試在Main上添加[STAThread]屬性嗎? https://stackoverflow.com/questions/1361033/what-does-stathread-do –
我做了,它只是阻止回調oObj_OnPiece被觸發。我需要訪問回調中的「塊」對象。這裏的問題是主方法和回調正在兩個不同的線程上運行。如果我可以在單個線程上運行它們,但同時能夠觸發回調,那應該可以解決問題。 – user2217057