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