Как исправить метод в Classes.pas

KeyValuePair<K,V> структура, не класс. Это похоже на выполнение:

int i = 10;
if (i != null) ...

(Хотя это на самом деле законно, с предупреждением, из-за нечетных nullable правил преобразования. Важный бит - то, что if условие никогда не будет верно.)

Для создания этого "дополнительным" можно использовать nullable форму:

static void Foo(KeyValuePair<object,string>? pair)
{
    if (pair != null)
    {
    }
    // Other code
}

Примечание? в KeyValuePair<object,string>?

7
задан Alistair Ward 26 September 2009 в 22:16
поделиться

2 ответа

I found VCLFixPatch:

http://andy.jgknet.de/blog/?page_id=288

I used the techniques from this to replace the method I wanted to patch at runtime.

7
ответ дан 6 December 2019 в 06:50
поделиться

Изменение стороны реализации Classes.pas не потребует перекомпиляции всего. Delphi выясняет, нужно ли перекомпилировать модуль, с помощью алгоритма, который выглядит примерно так:

  • Если DCU обнаружил:
    • Формат DCU устарел (старая версия компилятора)? Если да, нужен исходный код для перекомпиляции или ошибка времени компиляции.
    • Источник находится на пути? Если да, то если он новее, чем DCU, перекомпилируйте
    • Для каждого используемого модуля:
      • Повторять анализ при загрузке
      • Для каждого использованного символа («импорт»: тип, переменная, процедура, инициализированная константа и т. Д.) Из этого модуля:
        • Отличается ли версия символа импорта от символа, найденного в используемом модуле? Если это так, необходима перекомпиляция.
  • Если DCU не найден, необходимо будет найти и скомпилировать исходный код, в противном случае ошибка времени компиляции

Важной концепцией является концепция символьной версии . При сохранении DCU Delphi вычисляет хэш на основе описания интерфейса символа и связывает его с символом. Другие устройства, использующие этот символ, также сохраняют версию символа. Таким образом можно избежать конфликтов времени компоновки, вызванных устаревшими символами, в отличие от большинства компоновщиков C.

В результате вы сможете добавить Classes.pas в свой проект и изменить его реализацию ] раздел почти так, как вам нравится, и по-прежнему иметь возможность статически связываться с остальными RTL и VCL и сторонними библиотеками, даже если они представлены только в объектном формате.

На что следует обратить внимание:

  • Встроенные подпрограммы; тело встроенных подпрограмм является частью версии символа
  • Generics; сторона реализации общих типов и методов является частью соответствующих версий символов
19
ответ дан 6 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: