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

AssemblyResolve для сборок GAC

Я пытаюсь поместить свою сборку в GAC из соображений производительности. В нем есть некоторый код, который привязывается к событию AssemblyResolve. Однако, поскольку моя сборка была обработана GAC, обработчик события AssemblyResolve больше не срабатывает, когда источником разрешения является моя собственная сборка GAC.

Другими словами, моя сборка GAC содержит ссылку на XYZ.dll. Вместо того, чтобы распространять ее отдельно, моя сборка GAC содержит XYZ.dll, хранящуюся как встроенный ресурс, который загружается при запуске. Обработчик разрешения сборки возвращает динамически загруженный экземпляр XYZ.dll. Однако теперь, когда моя сборка находится в GAC, событие AssemblyResolve вообще не срабатывает для XYZ.dll.

Я предполагаю, что это связано с другим контекстом загрузки... но я не уверен, как с этим справиться. Как я могу заставить разрешение работать теперь, когда моя сборка проверена GAC?

25.02.2012

  • Звучит как ужасно сложная яма, в которую нужно зарыться. Почему вы выбрали событие AssemblyResolve для загрузки зависимости? Почему зависимость представляет собой встроенный ресурс, а не стандартную сборку CLR? 26.02.2012
  • Есть ли XYZ.dll в GAC? Я бы прицепился к процессу, который должен был загрузить вашу сборку и XYZ.dll и посмотреть, откуда она загружается. 26.02.2012
  • @ProgrammingHero Этот стандарт подходит, если вы хотите объединить сборки, но не хотите/не можете использовать ILMerge. см. research.microsoft.com/en-us/people/mbarnett/ilmerge .aspx 26.02.2012
  • Это больше проблема развертывания. Развертывание 15 сборок — кошмар обслуживания. 26.02.2012
  • И чтобы ответить на вопрос, Майк, да, я ясно вижу, что dll загружается через AppDomain.CurrentDomain.GetAssemblies(). AssemblyResolve просто не дает мне возможности выбрать dll. 26.02.2012
  • @mikez Я надеялся получить ответ, который пояснит, что для попытки сделать это была достаточно веская причина. Вместо того, чтобы поддерживать развертывание 15 сборок, теперь вам нужно поддерживать внедрение и динамическую загрузку 15 сборок. 26.02.2012
  • Мне легко поддерживать 15 сборок. Проблема заключается в том, чтобы все мои клиенты/клиенты распространяли и устанавливали эти сборки. 26.02.2012

Ответы:


1

Конечно, это не работает. GAC — это контрмера DLL Hell, она гарантирует, что любое приложение, использующее определенную версию DLL, получит конкретную версию DLL, которую они запросили. Последовательно, независимо от того, какой процесс просил об этом. Разрешение зависимостей библиотеки DLL, созданной GAC, на пути зондирования процесса вернет DLL Hell самым худшим из возможных способов. Это полностью аннулирует гарантию, которую предоставляет GAC, теперь нельзя доверять DLL, чтобы не работала последовательно.

Это не просто тонкий момент, в основном пугающий сценарий, когда базовый класс производного класса, определенный в сборке, созданной GAC, определяется в зависимой сборке. То, что вы надеетесь сработать, позволит реализовать совершенно базовый класс. Есть разумные шансы, что джиттер не уменьшится, если базовый класс не слишком отличается. Фактический результат во время выполнения весьма плачевный, неправильный код выполняется с несколькими способами диагностики, особенно для пользователя без отладчика. DLL Hell — это кошмар пользователя, жертвой которого является человек, наименее способный диагностировать и устранять проблему.

CLR категорически отказывается позволить вам стрелять в ногу пользователя таким образом. Да, контекст загрузки — это ключ, Fusion — это базовый API.

25.02.2012
  • Спасибо за ответ. Я бы не сказал, что GAC является такой сильной мерой противодействия этому аду. Это просто еще одна его форма. Я предполагаю, что мне придется развернуть другие библиотеки DLL в GAC, если я хочу пойти по этому пути. 26.02.2012
  • Что ж, да, GAC мешает, когда вы намеренно хочете DLL Hell. 26.02.2012
  • Все, чего я действительно хотел, — это избавиться от необходимости распространять 15 dll вместо одной. Моим клиентам нужен черный ящик, а не миллион dll и зависимостей. 26.02.2012
  • Потому что тогда у вас есть другой набор проблем - я говорю своему клиенту загрузить инфраструктуру System.Reactive и установить ее перед установкой моей dll? Или я распространяю его с MSI моей dll? И если я это сделаю, это означает, что я беру на себя ответственность за это, что нехорошо. А как же Замок Виндзор? Я думаю, мне нужно поместить это в GAC с моей dll... но что, если другое приложение на компьютере использует Windsor и для параметра «Специальная версия» установлено значение «ложь»? Я потенциально просто сломал их приложение. То же самое с Entity Framework 4.1. Или ASP .NET MVC 3. Ад DLL жив и здоров. 26.02.2012
  • Я поместил сборку в GAC только для более быстрого запуска. Насколько я понимаю, GAC действительно хорошо работает только для системных сборок ... но наличие моей dll там действительно улучшает время холодного запуска. 26.02.2012
  • Новые материалы

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

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

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

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

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

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

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