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

Встроенный и установленный IronPython - путаница в версиях dll

У меня есть приложение со встроенным IronPython, которое использует его для выполнения сценариев, которые пишут пользователи. Когда установлено только мое приложение, все работает как положено. Я встроил библиотеки DLL IronPython 2.7.4 (мои DLL exe и IronPython находятся в одной папке после установки).

Однако на некоторых клиентских машинах установлен IronPython 2.7.2. Он устанавливает свои dll в GAC, и мое приложение в конечном итоге использует их вместо dll, которые я поставлял с приложением и приложением. Это приводит к сбою моего приложения, поскольку я использую свойство, недоступное в 2.7.2.

Проблема в том, что .NET по какой-то причине видит эти сборки как имеющие одну и ту же версию (2.7.0.40). Как видно на изображении ниже, версии файлов разные: введите описание изображения здесь

Правый - это тот, который я поставляю с моим приложением, а левый - тот, который поставляется с IronPython 2.7.2. Я ничего не регистрирую в GAC, но это то, что зарегистрировано в GAC (установка IronPython добавила это):

C:\ $ gacutil /l | findstr IronPython
  IronPython, Version=2.7.0.40, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL
  IronPython.Modules, Version=2.7.0.40, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL

Как видите, они зарегистрированы для версии 2.7.0.40.

У меня вопрос: как заставить мое приложение использовать версию 2.7.4.1000 сборок IronPython, а не 2.7.2.1001, зарегистрированную в GAC? Почему .NET игнорирует третий компонент номера версии и можно ли его изменить?

Изменить:

Если это важно, с установленным IronPython 2.7.2 моя программа не работает со следующей ошибкой:

Необработанное исключение: System.MissingMethodException: метод не найден: 'Boolean IronPython.Hosting.PythonConsoleOptions.get_BasicConsole ()'.

29.12.2013

  • Будущие версии IronPython (3.0) также будут включать неподписанные сборки для включения в приложения, которые позволят избежать этой проблемы. 13.01.2014
  • Спасибо за комментарий, я с нетерпением жду IronPython 3.0. 14.01.2014

Ответы:


1

Проблема в том, что и IronPython 2.7.2, и IronPython 2.7.4 имеют одинаковый номер версии сборки, который, как вы сообщили, 2.7.0.40.

Итак, учитывая это, ваша проблема в том, что, по-видимому, в GAC есть версия сборки IronPython.dll и локальная версия с тем же номером версии. Согласно этому ответу, нет возможности загрузить локальную версию вместо версии GAC.

В этой ситуации я могу думать о двух возможностях:

  1. Перекомпилируйте (или выполните постобработку и переподпишите) сборку IronPython.dll с новым номером версии и используйте перенаправление сборки, чтобы запросы к обычной сборке IronPython.dll перенаправлялись в вашу локальную сборку;
  2. При запуске приложения проверьте версию IronPython и, если вы обнаружите несоответствующую версию IronPython, попросите своих потребителей обновить свои установки до IronPython 2.7.4. Например.:

    string ironPythonFileVersion = ((AssemblyFileVersionAttribute)typeof(IronPython).Assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false)[0]).Version;
    if (ironPythonFileVersion == "2.7.2.1001") {
        // IronPython 2.7.2 was loaded. Deal as appropriate.
    }
    
29.12.2013
  • Принуждение клиентов к обновлению IronPython - это не вариант, но другое предложение решило мою проблему. Я использовал ILMerge для изменения версии сборки IronPython на 2.9.9.9. Я не верю, что он достигнет этого номера версии в ветке v2, поэтому я должен быть в безопасности. При выборе этой версии проблем не возникает, если установлены более старые версии IronPython. 30.12.2013
  • Оказалось, что версия 2.9.9.9 у меня не работает, так как PyCharm проверяет версию сборки и не знает, как обращаться с pyhton 2.9. Смена версии на 2.7.32768.32768 сделала это (на всякий случай, если это кому-то еще понадобится). 14.01.2014

  • 2

    Я предлагаю изучить Перенаправление версий сборки . Вы бы сделали что-то вроде этого в своем app.config:

    <dependentAssembly>
       <assemblyIdentity name="IronPython"
         publicKeyToken="TOKEN"
         culture="en-us" />
       <!-- Assembly versions can be redirected in app, 
         publisher policy, or machine configuration files. -->
       <bindingRedirect oldVersion="2.7.2.1001" newVersion="2.7.4.1000" />
       <publisherPolicy apply="no" />
    </dependentAssembly>
    

    Ключевым моментом здесь является добавление элемента publisherPolicy. Похоже, что IronPython имеет политику издателя, который вызывает вашу проблему, поэтому вам следует попробовать переопределить его.

    29.12.2013
  • Это решение не сработает, потому что номера версий 2.7.2.1001 и 2.7.4.1000 - это номера версий, указанные с помощью атрибута AssemblyFileVersion, а не атрибута AssemblyVersion. 29.12.2013
  • @JeanHominal Вы правы, я пропустил эту деталь при первом чтении. 30.12.2013
  • Новые материалы

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

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

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

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

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

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

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