2017-08-23 27 views
0

ためにマーシャリングされたインターフェイスは、私は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コールバックメソッド内から同じピースオブジェクトを受け取り、処理する必要があり、上記の例外がスローされることです。私は他の同様の投稿を閲覧しましたが、スレッドの問題だと分かっていますが、解決方法は不明です。どんな助けもありがとうございます。

+0

[STAThread]属性をMainに追加できますか? https://stackoverflow.com/questions/1361033/what-does-stathread-do –

+0

私は、単純にコールバックoObj_OnPieceがトリガーされるのを防ぎました。私はコールバック内の "ピース"オブジェクトにアクセスする必要があります。ここでの問題は、メインメソッドとコールバックが2つの異なるスレッドで実行されていることです。私はそれらを単一のスレッド上で実行することができますが、同時にコールバックをトリガーすることができれば、問題を解決するはずです。 – user2217057

答えて

0

アプリケーション内の別のスレッドで既に使用されているインターフェイスにクエリを実行しようとしました。あなたの場合は、あなたのメインスレッドのインターフェイスを最初にあなたの呼び出しで質問しました。私はこれが最初のスレッドだと思います。

イベントハンドラがイベントを処理するために別のスレッドを開いている可能性はありますか?この場合、インターフェイスにアクセスする前にイベントハンドラにブレークポイントを1つ追加してチェックしてください。プログラムを起動し、実行中のスレッドが2つあるかどうかを確認してください。

あなたがしなければならないことは、COMオブジェクトへの最初の呼び出しを削除することによって、1つのスレッドでのみインターフェイスを照会することです。

+0

私は同意しますが、1つのスレッドでしかインターフェイスに問い合わせることの問題は、最初のスレッドoObj.OnPiece + = PieceArravedのイベントに依存していることです。これは、コールバックが定期的にトリガされる時点です。同時に、後で処理するためにコールバック内のoObjのいくつかのプロパティにアクセスする必要があります。 – user2217057

+0

comオブジェクトのスレッドを定義し、ディスパッチャ経由で通信するのはどうですか? – KimKulling

関連する問題