Выберите конкретный канал на Activator.GetObject - PullRequest
6 голосов
/ 28 апреля 2011

Предположим, что вы зарегистрировали два TcpChannels в .NET Remoting.

Затем я пытаюсь получить прокси, используя Activator.GetObject, используя URL-адрес tcp://...

Можно ли выбрать, какойканал для использования?

Заранее спасибо.

1 Ответ

7 голосов
/ 06 декабря 2011

Вы это решили?

У меня была точно такая же проблема на прошлой неделе.(Небольшой неопубликованный побочный эффект nunit состоит в том, что он запускает канал tcp по умолчанию при загрузке ваших dll для запуска модульных тестов (моя проблема) ... затем я создавал пользовательский экземпляр TcpClientChannel с пользовательскими приемниками, чтобы общаться с нашимисерверное программное обеспечение ... и наши приемники не запускались, когда я создавал объект сервера)

Существует 3 решения:

  1. Если вы хотите, чтобы одно навсегда переопределилов противном случае просто передайте свойство «priority» в конструктор IDictionary вашего TcpClientChannel.Значение по умолчанию, если оно не установлено, равно 1, поэтому, если вы хотите, чтобы оно переопределило, скажем, что регистрация канала "tcp" по умолчанию, затем установите значение больше 1. Обратите внимание, что свойство "name" также должно быть установлено, но может иметь значение string.Empty, если требуется (итогда вы можете иметь столько их, сколько захотите)

  2. Назовите ваши каналы при регистрации, а затем напишите хорошую оболочку IDisposable для вызова в конструкции «using», которая вызывает ChannelServices.Unregister(...) на каналах, которые вы не хотите активировать при вызове Activator.GetObject (...).Затем, когда ваш блок «using» заканчивается (т.е. вызывает Dispose ()), просто перезагрузите незарегистрированные каналы ... убедитесь, что вы используете «lock» для некоторой общей ссылки на объект, если она многопоточна в вашем приложении ... это может создатьгорлышко бутылки!(Это подход, который я выбрал, поскольку мои модульные тесты использовали предварительно написанную библиотеку, которая создала соединение с сервером: риск нестабильности в производственном программном обеспечении ради моего модульного тестирования был слишком высок)

  3. Временно измените приоритет целевого канала, используя глубокое отражение (т. Е. Возитесь с частным FieldInfos ... а именно с частным int _channelPriority (я думаю) ... используйте рефлектор для двойной проверки), прежде чем вызывать Activator.GetObject.Это также открыто для проблем с многопоточностью, а также не является версией фреймворка (так что я избежал этого)

...