У меня есть старый образ VW3/ENVY с посылкой, загруженной как неуправляемый код (именно такая ситуация Mastering ENVY/DEVELOPER предупреждает об этом). К сожалению, эта проблема случилась давно и уже поздно просто "вернуться" к изображению без загруженной посылки.
Судя по всему, есть способ решить эту проблему (у нас есть один образ разработки, где это решено, и есть обычные карты конфигурации, которые содержат точно такой же код, что и неуправляемая посылка, но не могут быть загружены), но точный способ уже давно забыт (и есть некоторые проблемы с использованием этого конкретного образа разработчика в качестве основы для нового образа среды выполнения, поэтому мне нужно выяснить, как это сделать снова).
Теоретически должна быть возможность удалить посылку и перезагрузить код с карты конфигурации. На практике все обычные способы (использование ParcelBrowser или прямой вызов UnmanagedCode>>remove) не работают. Я даже пытался вручную удалить неверные селекторы из словаря методов, но после определенного момента (включая вызов #primBecome:) все изображение полностью зависало (я даже не могу зайти в отладчик). Я начал взламывать экземпляры классов и методов, надеясь обмануть ENVY, заставив их думать, что эти конкретные методы являются обычным версионным кодом, но пока безуспешно.
Есть ли вокруг какие-нибудь гуру болтовни/зависти, которые все еще помнят достаточно VW 3, чтобы дать мне какие-либо указатели?
Обновление статуса После недели попыток решить проблему я, наконец, сделал это, по крайней мере, частично, так что, если кому-то интересно...
Во-первых, мне пришлось исправить файловые указатели для неуправляемого кода (иначе все, что пыталось прикоснуться к методам, выбрасывало исключение). Похоже, что ENVY расширяет Parcel, так что теоретически все целочисленные файловые указатели заменяются на файловый указатель ENVY void
при загрузке, но в моем случае мне пришлось делать это вручную (Parcel обеспечивает перечисление для всех селекторов, которые он определяет). Другой способ — настроить код filePointer
, но это нельзя легко сделать автоматически для каждого изображения, где это необходимо.
Затем посылка может быть отброшена, при этом информация о посылке удаляется, но сохраняется код. Официальный механизм «Отменить» должен иметь действительный файл изменений (который envy не использует, поэтому его нужно установить вручную, а затем сбросить) и источник посылки (который, к счастью, у нас был).
Чтобы иметь возможность вносить какие-либо изменения в методы (либо вручную, либо путем загрузки приложения или класса из ENVY), им необходимо избавиться от своего неуправляемого статуса. Это можно сделать, настроив вручную TheClass>>applicationAssocs
(я также избавился от всех ссылок на классы в UnmanagedCode как временные метки и удалил ссылку на отброшенную посылку). На самом деле у меня была некоторая информация о том, как добраться до этой точки от моего босса, но я не мог понять инструкции, пока почти не понял это сам.
Это, наконец, позволило мне загружать и перезагружать все приложения, содержащие классы. В теории. На практике изображение по-прежнему полностью зависало всякий раз, когда я пытался загрузить более новую версию приложения (которая содержала код, ранее находившийся в посылке).
Оказалось, что сбои были связаны абсолютно не с неуправляемостью кода, а с тем, что рассматриваемая посылка модифицировала InputState>>process:
, где вызвала исключение из-за отсутствующего и/или неинициализированного класса переменная (метод InputState>>initialize
не вызывался до тех пор, пока не появился новый метод process:
). Мне пришлось модифицировать класс Notifier
, чтобы сбрасывать все исключения в файл, чтобы узнать, что происходит. Добавление переменной класса в источник класса (вместо добавления ее через отражение), приостановка потока обработки ввода через toBeLoadedCode
и его повторный запуск в методе loaded
и создание новой версии приложения решили даже эту проблему.
Теперь все работает, в теории. На практике он по-прежнему непригоден, потому что перезагрузка приложений WindowSystem или VisualworksBase приводит к запуску их блоков инициализации, и многие настройки сбрасываются до значений по умолчанию — шрифты и размеры шрифтов, цвета окон, настройки пользовательского интерфейса... похоже, есть способ просто сохранить настройки в файл и загрузить их позже, или просто посмотреть, каковы все настройки (либо официальное меню настроек не показывает все, либо у нас сильно измененное изображение ... так много для реконструкции с нуля). Но это совсем другой вопрос.