C # обратный вызов из DLL - PullRequest
9 голосов
/ 13 ноября 2008

Я пишу Приложение A и DLL B, оба на C # .NET. Как мне сделать следующее:

  1. Функция вызова в B
  2. Хотите, чтобы B использовал делегат / обратный вызов для обновления статуса в пользовательском интерфейсе A

Это , а не о BackgroundWorker ... эта часть прекрасно работает в A. Что я не вижу, так это как B сообщает, какую функцию вызывать в A.

Ответы [ 4 ]

13 голосов
/ 13 ноября 2008

Чтобы расширить ответ Роба Пруза, вам нужно объявить делегата и затем передать в него соответствующий метод.

В Б:

public delegate void CallbackDelegate(string status);

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

В А:

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

А при вызове метода:

B.DoWork("my params", MyCallback);
6 голосов
/ 13 ноября 2008

У вас есть два варианта. Наиболее распространенным является наличие события в B, а ваш пользовательский интерфейс в A подписывается на это событие. Затем B запускает это событие.

Второй вариант - передать делегата от A в качестве параметра для вызова метода в B. Затем B может вызвать этот делегат.

1 голос
/ 13 ноября 2008

Если вы контролируете B, то ответы Роба Пруза или Броди будут работать нормально.

Но что, если вы вообще не можете изменить B? В этом случае вы всегда можете заключить метод в делегат вашего собственного создания, если его подпись совпадает с сигнатурой целевого метода.

Итак, скажем, у вас есть экземпляр класса с именем B и открытый метод с именем b () (конечно, из сборки Bllll). Класс A в приложении A может вызывать его асинхронно следующим образом:

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
    }
}
1 голос
/ 13 ноября 2008

Передача объекта обратного вызова в вызове от A к B. Используйте интерфейс (или тесно связанные библиотеки). Убедитесь, что объект обратного вызова поддерживает потоки и потокобезопасен.

...