Выберите конкретный канал на Activator.GetObject
Предположим, что вы зарегистрировали два канала TcpChannel в.NET Remoting.
Затем я пытаюсь получить прокси с помощью Activator.GetObject
используя URL tcp://...
Можно ли выбрать какой канал использовать?
Заранее спасибо.
1 ответ
Вы решили это?
У меня была точно такая же проблема на прошлой неделе. (Небольшой неопубликованный побочный эффект nunit заключается в том, что он запускает канал tcp по умолчанию при загрузке ваших dll для запуска модульных тестов (моя проблема)... затем я создавал пользовательский экземпляр TcpClientChannel с пользовательскими приемниками, чтобы общаться с нашими серверное программное обеспечение... и наши приемники не запускались, когда я создавал объект сервера)
Есть 3 решения:
Если вы хотите, чтобы одно навсегда переопределило другое, просто передайте свойство "priority" в конструктор IDictionary вашего TcpClientChannel. Значение по умолчанию, если оно не установлено, равно 1, поэтому, если вы хотите, чтобы оно переопределило, скажем, что регистрация канала "tcp" по умолчанию устанавливается более чем на 1. Обратите внимание, что свойство "name" также должно быть установлено, но может иметь значение string.Empty, если требуется (и тогда вы можете иметь столько, сколько хотите)
Назовите ваши каналы при регистрации, а затем напишите красивую оболочку IDisposable для вызова в конструкции "using", которая вызывает ChannelServices.Unregister(...) для каналов, которые вы не хотите активировать при вызове Activator.GetObject(...). Затем, когда ваш блок "using" заканчивается (т.е. вызывает Dispose()), просто перезагрузите незарегистрированные каналы... убедитесь, что вы используете "lock" для некоторой общей ссылки на объект, если она многопоточная в вашем приложении... это может создать горлышко бутылки! (Это подход, который я выбрал, так как мои модульные тесты использовали предварительно написанную библиотеку, которая создала соединение с сервером: риск нестабильности в производственном программном обеспечении ради моего модульного тестирования был слишком высок)
Временно измените приоритет целевого канала, используя глубокое отражение (т. Е. Возитесь с частным FieldInfos... а именно с частным int _channelPriority (я думаю)... используйте рефлектор для двойной проверки), прежде чем вызывать Activator.GetObject. Это также открыто для проблем с многопоточностью, а также не является версией фреймворка (поэтому я избежал этого)