2012-04-04 12 views
0

Hier ist, wie die Anwendung entwickelt wird - Ich habe einen COM-Server, der Ereignisse unter bestimmten Bedingungen auslöst. Ich habe eine C# -Client-UI, die diese von diesem COM-Server ausgelösten Ereignisse behandeln soll.Behandlung von COM-Rückrufen in C# -Client

Es gibt einen Delegaten in meinem C# -Client, den ich an den COM-Server übergebe, und er ruft ein Ereignis zurück. Ich habe einen benutzerdefinierten Wrapper, der den Delegaten als Funktionszeiger verwaltet. So ähnlich ...

 Fxn1inCOMWrapper([In, MarshalAs(UnmanagedType.FunctionPtr)] Client.SetStatusDelegate StatusCallback); 

Der Callback-Mechanismus funktioniert. Das Problem hier ist, dass, sobald ich den Rückruf bekomme, ich eine andere Methode im COM-Server aufrufen soll, um die weitere Verarbeitung aufzurufen.

Ich bin nicht in der Lage, den zweiten Funktionsaufruf zu COM-Komponente von der C# -Rückrufmethode zu machen, und es beschädigt den Stapel in COM, und es gibt mir eine Ausnahme zurück. Ich vermute es ist der Fall, weil der Rückruf nicht der gleiche Thread ist, auf dem das COM-Objekt erstellt wurde und der erste Aufruf erfolgte. Ist es möglich, dieses Problem zu umgehen?

Eine Option war das Setzen eines Flags beim Ereignis-Callback in C# -Client. Und auf einem Timer aus dem Haupt-Thread, überprüfen Sie die Flagge und wenn ja, machen Sie den zweiten Anruf. Aber es muss sicherlich einen eleganteren Weg geben, dies zu tun ... Kann mir bitte jemand helfen?

+1

Es ist nicht alles mit einem Gewinde hat zu tun, wird das Attribut nichts tun. Sie müssen genauer diagnostizieren, was genau falsch läuft. COM unterstützt Ereignisse, die Sie möglicherweise verwenden möchten. –

Antwort

0

Versuchen Sie, das Threading-Attribut für Ihre Main()-Funktion zu ändern. Zum Beispiel, wenn Sie haben:

[STAThread] 
static void Main() 

Änderung es zu:

[MTAThread] 
static void Main() 
Verwandte Themen