Проблема с тем, что статические данные просто отображаются из двоичного файла, состоит в том, что для них требуется форматирование всех данных, которые должны быть заморожены во время компиляции.Поскольку среда выполнения определяет расположение структур (включая строки и массивы), компилятор не может знать, каким будет это расположение.Даже если компилятор выдает макет текущей среды выполнения, он может быть нарушен в будущем.Это означает, что только структуры с явным макетом, которые были определены в этой сборке, могут быть статически сопоставлены из файла, что, откровенно говоря, не слишком полезно.
Спецификация языка C # 4.0, раздел 7.6.10.4, говорит:
За исключением небезопасного контекста (§18.1), расположение массивов не определено.
В 18.5.8:
Порядок вкакие элементы упакованы в структуру, не указано.
Структура string
фактически изменилась между .NET 3.5 и 4.0 (они удалили поле);он изменился с
[NonSerialized]
private int m_arrayLength;
[NonSerialized]
private char m_firstChar;
[NonSerialized]
private int m_stringLength;
на
[NonSerialized, ForceTokenStabilization]
private char m_firstChar;
[NonSerialized]
private int m_stringLength;
Это не проблема в C или C ++, потому что компилятор определяет расположение структур.Конечно, это также означает, что вам нужно перекомпилировать все, что использует структуру / класс, чтобы изменить его макет.