Подтвердить что ты не робот

Как лучше общаться между AppDomains?

У меня есть приложение, которому необходимо отправить умеренно высокий объем сообщений между несколькими AppDomains. Я знаю, что я мог бы реализовать это, используя удаленный доступ, но я также заметил, что есть делегаты между доменами. Кто-нибудь смотрел на эту проблему?

4b9b3361

Ответ 1

У меня был хороший успех с использованием WCF с привязкой именованных каналов. Использование именованных каналов не создает сетевого трафика и использует двоичное кодирование, поэтому оно должно быть довольно быстрым, не жертвуя возможностью распространения в будущих сценариях масштабирования.

EDIT: Обратитесь здесь за более подробной информацией, включая ссылку на пример реализации.

Ответ 2

Делегат междоменного домена допускает только метод void с нулевыми параметрами, и, вероятно, это не так, как вы думаете. Он едва полезен в качестве простого обратного вызова для целей уведомления от одного приложения к другому, например. такой как InitComplete() или что-то в этом роде.

Remoting - это единственный выбор, называете ли вы его WCF или каким-либо другим, передавая сериализуемые типы или используя типы MBRO (MarshalByRefObjects). Это не так сложно, как вы думаете.

-Oisin

Ответ 3

Я только что обнаружил, что вы также можете использовать AppDomain.SetData, но это только один способ От домена хоста до дочернего домена.

static void RunInChildDomain()
{
     AppDomain childDomain = AppDomain.CreateDomain("friendlyName");
     string parameterValue = "notmii";
     childDomain.SetData("parameter", parameterValue);
     childDomain.DoCallBack(PrintName);
}

static void PrintName()
{
     string Name = Convert.ToString(AppDomain.CurrentDomain.GetData("parameter"));
     Console.WriteLine(Name);
}

Вы также можете создавать связь, управляемую исключительными данными между дочерним и хост-апдоменом, с помощью события AppDomain.FirstChanceException:)

Ответ 4

Это просто мысль, но я слышал, что даже для междоменной связи WCF был бы рекомендованным, начиная с .NET 3.0, конечно. На самом деле это имеет смысл, поскольку удаленный доступ - это еще одна технология, завернутая WCF.

Ответ 5

Я хочу расширить на xOn ответ. Он рекомендует использовать либо WCF, либо MarshalByRefObject, но учитывая, что вопрос задает вопрос о связи между AppDomains, а не о связи между процессами, я думаю, что подход MBRO значительно проще реализовать и, следовательно, правильный ответ.

Когда я сам изучал эту проблему, я сначала попытался понять, как дочерний AppDomain мог общаться с родителем, пока я не понял, что вы можете передать дескриптор объекта MBRO в дочерний элемент, а потом ребенок может развернуть которые обрабатывают связь с родителем (или любым другим AppDomain). Я разместил решение для своего вопроса здесь.

Впоследствии я узнал, что вы можете определить интерфейс, реализовать этот интерфейс в сложном классе, а затем передать дескриптор только интерфейсу. Это может значительно уменьшить количество сборок, которые могут потребоваться для загрузки дочернего AppDomain.