2008-11-13 20 views
9

Ich schreibe Application A und DLL B, beide in C# .NET. Wie mache ich die folgenden:C# -Rückruf von DLL

  1. A ruft Funktion in B
  2. B Möchten Sie delegieren/Callback verwenden Status in UI von A nicht über Background Dies ist

zu aktualisieren .. .dieser Teil funktioniert in A gut. Was ich nicht sehen kann ist, B wissen zu lassen, welche Funktion in A aufgerufen werden soll.

Antwort

6

Sie haben zwei Möglichkeiten. Am gebräuchlichsten ist es, ein Ereignis in B zu haben und Ihre Benutzerschnittstelle in A dieses Ereignis abonnieren zu lassen. B feuert dann dieses Ereignis.

Die zweite Option besteht darin, einen Delegaten von A als Parameter an den Methodenaufruf in B zu übergeben. B kann dann diesen Delegaten aufrufen.

+0

Ich ging für die zweite Option, aber die Syntax hat mich verblüfft. –

+0

Sie vermissen eine dritte Option. Sie können einen Delegaten in A erstellen, um die B-Methode zu spiegeln, sodass B nichts davon wissen muss. Hervorragend für den asynchronen Aufruf von Methoden in Drittanbieter-Bibliotheken, die dies normalerweise nicht unterstützen würden. –

+0

Ich habe am Ende sowohl die erste als auch die zweite Option versucht. Die Syntax für die zweite war in meinem Fall sauberer. Vielen Dank! –

1

Übergeben Sie das Callback-Objekt im Aufruf A make an B. Verwenden Sie eine Schnittstelle (oder fest gebundene Bibliotheken). Stellen Sie sicher, dass das Callback-Objekt Thread-bewusst und Thread-sicher ist.

12

Um Rob Prouses Antwort zu erweitern, müssen Sie einen Delegaten deklarieren und dann eine übereinstimmende Methode eingeben.

In B:

public delegate void CallbackDelegate(string status); 

public void DoWork(string param, CallbackDelegate callback) 
{ 
    callback("status"); 
} 

In A:

public void MyCallback(string status) 
{ 
    // Update your UI. 
} 

Und wenn Sie die Methode aufrufen:

B.DoWork("my params", MyCallback); 
+1

Danke! Ich habe es gerade ausgearbeitet, also ist es schön, eine Bestätigung zu haben. –

+0

Natürlich, wenn A und B in verschiedenen Assemblys sind, müssen Sie möglicherweise den Delegaten in einer eigenen Assembly stecken, um rekursive Abhängigkeitsprobleme zu vermeiden. – Soraz

+0

Wenn der Delegat in B deklariert ist, wie würden Sie eine zirkuläre Abhängigkeit erhalten? –

1

Wenn Sie B steuern, dann antwortet Rob Prouse oder Brodys wird funktioniert gut.

Aber was ist, wenn Sie B überhaupt nicht ändern können? In diesem Fall können Sie eine Methode immer in einen von Ihnen selbst erstellten Delegierten umbrechen, solange die Signatur der Signatur der Zielmethode entspricht.

Also sagen Sie, Sie haben eine Klasseninstanz namens B mit einer öffentlichen Methode namens b() (natürlich von der B-DLL-Assembly). Klasse A in der A-Anwendung kann es asynchron wie folgt aufrufen:

public class A 
{ 
    delegate void BDelegate(); 

    public void BegineBMethod() 
    { 
     BDelegate b_method = new BDelegate(B.b); 
     b_method.BeginInvoke(BCallback, null); 
    } 

    void BCallback(IAsyncResult ar) 
    { 
     // cleanup/get return value/check exceptions here 
    } 
}