ためにマーシャリングされたインターフェイスは、私は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
であると呼ばれますバックエンドに接続するゲートウェイとして機能し、定期的にいくつかの "ピース"オブジェクトを受け取るC#コンソールアプリケーション内のオブジェクト。
テストとして、メインメソッド内から試してみると、すべて正常に動作します。接続し、ピースオブジェクトを受け取り、そのプロパティにアクセスできます。問題は、oObj_OnPieceコールバックメソッド内から同じピースオブジェクトを受け取り、処理する必要があり、上記の例外がスローされることです。私は他の同様の投稿を閲覧しましたが、スレッドの問題だと分かっていますが、解決方法は不明です。どんな助けもありがとうございます。
[STAThread]属性をMainに追加できますか? https://stackoverflow.com/questions/1361033/what-does-stathread-do –
私は、単純にコールバックoObj_OnPieceがトリガーされるのを防ぎました。私はコールバック内の "ピース"オブジェクトにアクセスする必要があります。ここでの問題は、メインメソッドとコールバックが2つの異なるスレッドで実行されていることです。私はそれらを単一のスレッド上で実行することができますが、同時にコールバックをトリガーすることができれば、問題を解決するはずです。 – user2217057