2008-11-13 9 views
9

Tôi đang viết Ứng dụng A và DLL B, cả trong C# .NET. Làm thế nào để làm như sau:Gọi lại C# từ DLL

  1. A gọi hàm trong B
  2. Muốn B để sử dụng đại biểu/callback để cập nhật trạng thái trong giao diện người dùng của A

Đây là không về BackgroundWorker .. một phần hoạt động tốt trong A. Những gì tôi không thể thấy là làm thế nào để cho B biết những gì chức năng để gọi trong A.

Trả lời

6

Bạn có hai lựa chọn. Phổ biến nhất là để có một sự kiện trong B và có giao diện người dùng của bạn trong A đăng ký sự kiện đó. B sau đó kích hoạt sự kiện đó.

Tùy chọn thứ hai là chuyển một đại biểu từ A làm tham số cho cuộc gọi phương thức trong B. B sau đó có thể Gọi đại biểu đó.

+0

Tôi đã chọn tùy chọn thứ hai, nhưng cú pháp khiến tôi bối rối. –

+0

Bạn đang thiếu tùy chọn thứ ba. Bạn có thể tạo một đại biểu trong A để che giấu phương thức B, sao cho B không bao giờ cần phải biết gì về nó. Thật tuyệt vời khi gọi các phương thức trong thư viện của bên thứ ba một cách đồng bộ mà thông thường sẽ không hỗ trợ nó. –

+0

Tôi đã kết thúc thử cả hai tùy chọn đầu tiên và thứ hai. Cú pháp thứ hai là sạch hơn trong trường hợp của tôi. Cảm ơn! –

1

Chuyển đối tượng gọi lại trong cuộc gọi A đến B. Sử dụng giao diện (hoặc các thư viện bị ràng buộc chặt chẽ). Đảm bảo đối tượng gọi lại là chủ đề nhận biết và luồng an toàn.

12

Để mở rộng câu trả lời của Rob Prouse, bạn cần khai báo một đại biểu và sau đó chuyển một phương thức khớp vào đó.

Trong B:

public delegate void CallbackDelegate(string status); 

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

Trong A:

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

Và khi bạn gọi phương thức:

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

Cảm ơn bạn! Tôi đã làm việc này ra, vì vậy nó là tốt đẹp để có xác nhận của bạn. –

+0

ofcourse, nếu A và B là trong hội đồng khác nhau, bạn có thể phải dính các đại biểu trong hội đồng riêng của mình để tránh các vấn đề phụ thuộc đệ quy. – Soraz

+0

Nếu đại biểu được khai báo trong B, bạn sẽ nhận được sự phụ thuộc vòng tròn như thế nào? –

1

Nếu bạn kiểm soát B, sau đó Rob Prouse hoặc Brody của câu trả lời sẽ làm việc tốt.

Nhưng nếu bạn không thể thay đổi B thì sao? Trong trường hợp đó, bạn luôn có thể bọc một phương thức trong một đại biểu do chính bạn tạo ra, miễn là nó khớp với chữ ký của chữ ký của phương thức đích.

Vì vậy, giả sử bạn có một cá thể lớp có tên B với phương thức công khai có tên b() (từ tập hợp dll B, dĩ nhiên). Loại A trong ứng dụng A có thể gọi nó không đồng bộ như thế này:

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 
    } 
}