Nano Hash - криптовалюты, майнинг, программирование

Обновление App.config после изменения bindingRedirect

Я работаю с WinForms, проектом, в котором есть несколько странных требований. Это существующая бизнес-система, установленная во многих местах в довольно широком диапазоне сред. Частью этого разнообразия является смесь версий SQL Server и, что особенно важно, версий SQL Server Reporting Services. Все используют по крайней мере 2005 год, но около 50% наших пользователей используют какой-то вариант 2008 года.

К сожалению для меня, мне нужно иметь возможность запускать отчет на стороне клиента, написанный в RDL версии 2008. На данный момент я не могу существенно изменить отчет, поэтому переписать его в RDL версии 2005 не получится. Загвоздка в том, что для этого отчета (как он был написан в 2008 году) требуется элемент управления 2008 ReportViewer. Однако элемент управления ReportViewer 2008 года не может подключиться к службам SSRS 2005 года.

Решение, которое я придумал, более чем хакерское, но оно устранит 90% возникших проблем. Я оставил ссылки, указывающие на версию ReportViewer 2005 года, и я изменяю конфигурацию приложения при запуске, чтобы добавить теги перенаправления привязки сборки, перемещающиеся с версии 9.0.0.0 на 10.0.0.0 для ReportViewer.Common и ReportViewer.WinForms, если целевой сервер отчетов пользователя идет 2008 год.

Как бы ни вызывало подергивание это решение, оно работает для меня. Пользователи, работающие под управлением SSRS 2005, по-прежнему могут получать доступ к своим существующим отчетам, но не к новому. Пользователи, использующие SSRS 2008, могут получить доступ ко всему. Моя единственная проблема в том, что я не смог найти способ обновить данные конфигурации. Я обновляю эту информацию перед загрузкой любой из сборок, но вызов ConfigurationManager.RefreshSection("runtime"), похоже, не имеет никакого эффекта. После перезапуска приложения загружаются соответствующие сборки, но мне бы очень хотелось, чтобы это изменение вступило в силу немедленно.

Любые мысли о том, как я могу заставить среду выполнения перезагрузить информацию о перенаправлении привязки из файла App.config во время выполнения?


  • Не буду публиковать решение, но я думаю, что этот пост о том, как изменить *.config, может помочь. Они делают это из класса установщика, но с той же предпосылкой. или вы можете использовать XmlDocument и изменить значения в зависимости от местоположения узла. 19.01.2011
  • @Brad: Спасибо, но проблема не в изменении самого файла; У меня это сделано и работает (кстати, я использую настоящие классы System.Configuration в сочетании с новыми классами XLinq). Проблема здесь в том, что я изменяю файл для текущего запущенного приложения (вместо другого приложения, такого как действие Installer) и, похоже, не могу заставить среду выполнения подобрать мои обновленные значения до перезапуска . 19.01.2011
  • Извините, я видел OpenExeConfiguration и прямое редактирование XML и подумал, что это сработает для ваших целей. Однако, согласно этот пост на Egghead, они говорят, что он не обновится, пока вы не выполните get. Вы уже пробовали это? 19.01.2011
  • @Brad: К сожалению, эти значения считывает среда выполнения, а не мой код. Из того, что говорит Ханс, похоже, что информация о конфигурации считывается один раз и кэшируется (что, очевидно, имеет смысл), поэтому независимо от того, что она имеет после того, как я ее изменю, она не будет отражена до перезапуска. 19.01.2011

Ответы:


1

После создания AppDomain данные конфигурации, влияющие на привязку, фиксируются. Что происходит в среде CLR по умолчанию при создании основного AD до того, как ваш код начнет работать. Если вы действительно в отчаянии, вы можете создать дополнительный домен приложения и присвоить ему собственный AppDomainSetup с другим файлом конфигурации. И загружает и запускает ваш обычный код запуска в этом AD. Не совсем уверен, какие побочные эффекты это может иметь.

18.01.2011
  • Спасибо, я как раз этого и боялся. Если мне придется прыгать через такие обручи, я просто покажу пользователю сообщение, если настройки должны измениться, и перезапущу приложение. Я просто надеялся, что это будет немного более гладко, чем это. 19.01.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..