TypeLoadException на x64, но прекрасен на x86 с structlayouts

Создайте новую страницу, назовите ее примерно как thank_you.php и сразу после fclose($file); перенаправьте на страницу с благодарностью.

<?php
  if(isset(

Создайте новую страницу, назовите ее примерно как thank_you.php и сразу после fclose($file); перенаправьте на страницу с благодарностью.

[110]

?>

POST['submit'])) { $email =

Создайте новую страницу, назовите ее примерно как thank_you.php и сразу после fclose($file); перенаправьте на страницу с благодарностью.

[110]

?>

POST['email']; $file = fopen("list.txt","a+") or die("file not open"); $s= $email; fputs($file,$s." ") or die("data not written"); fclose($file); header("Location: thank_you.php"); }

?>

9
задан Mysticial 10 January 2012 в 02:51
поделиться

4 ответа

Часть о наложении типов вводит в заблуждение здесь. Проблема состоит в том, который в ссылочных типах .NET должен всегда быть выровненный на границах размера указателя. Ваши работы объединения в x86 начиная с полевого смещения составляют 4 байта, который является размером указателя для системы на 32 бита, но перестал работать на x64 с тех пор там, это должно быть смещено несколько из 8. То же самое произошло бы при установке смещения на 3 или 5 на x86 платформе.

Править: Для сомневающихся - я не мог найти готовую ссылку в Интернете, но проверить Эксперта.NET 2.0 страницы 175 IL Assembler By Serge Lidin.

20
ответ дан 4 December 2019 в 10:05
поделиться

Я также заметил, что Вы упаковываете свой тип данных char в 1 байт. Символьные типы в.NET составляют 2 байта в размере. Я не могу проверить, является ли это фактической проблемой, но я перепроверил бы это.

3
ответ дан 4 December 2019 в 10:05
поделиться

Возможно, там идет что-то не так с должным Uint16 к, он не CLS-совместим (см. здесь: http://msdn.microsoft.com/en-us/library/system.uint16.aspx)

-2
ответ дан 4 December 2019 в 10:05
поделиться

Если Вы желаете поместить структуры в других структурах, которые являются самостоятельно Layoutind. Explict необходимо Использовать явное значение Размера (в байтах), если Вы ожидаете, что они будут работать в различных режимах разрядности (или на машинах с различными требованиями упаковки), Что Вы говорите, существует, "размечают вещи последовательно и не упаковывают внутренне, но используют столько пространства, сколько Вам нравится в конце". Если Вы не указываете Размер, время выполнения свободно добавить столько пространства, сколько этому нравится.

Причина, которую это в целом отказывается позволять структурам и типам объектов перекрыть, состоит в том, что стандартная программа GC должна быть свободна пересечь живой граф объектов. При выполнении этого это не может знать, если unioned (перекрывающееся) поле значимо как ссылка на объект или как необработанные биты (говорят что интервал или плавание). Так как это должно пересечь все живые ссылки на объект для поведения правильно, это закончило бы тем, что пересекло 'случайные' биты, которые могли бы указать где угодно в "куче" (или из него), как будто они были ссылками перед знанием этого, Вы - Общий Сбой Защиты.

С тех пор 32/64 ссылки поднимет 32 или 64 бита согласно времени выполнения, необходимо использовать Explict, только ссылки объединения со ссылками и типы значения с типами значения, удостовериться, что ссылочные типы выровненные к границам обеих целевых платформ, если они отличаются (Примечание: зависимый Во время выполнения видит ниже), и выполнить одно из следующих действий:

  1. Удостоверьтесь, что все поля ссылки являются последней записью в структуре - это затем свободно сделать структуру большей/меньшей в зависимости от разрядности среды выполнения.
  2. Вынудите все ссылки на объект использовать 64 бита, являетесь ли Вы на среде на 32 или 64 бита

Примечание по выравниванию: Извинения я был по ошибке на невыровненных полях ссылки - компилятор, удалили загрузку типа, если я не выполнил некоторое действие со структурой.

[StructLayout(LayoutKind.Explicit)]
public struct Foo
{
    [FieldOffset(0)]
    public byte padding;
    [FieldOffset(1)]
    public string InvalidReference;
}

public static void RunSnippet()
{
    Foo foo;
    foo.padding = 0;
    foo.ValidReference = "blah";
    // Console.WriteLine(foo); // uncomment this to fail
}

Соответствующие детали находятся в спецификации ECMA, http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf видит раздел 16.6.2, который передает под мандат выравнивание собственных значений размера включая и. Это отмечает, что невыровненная инструкция по префиксу существует для работы вокруг этого при необходимости.

На моно однако (и Intel OSX и Win32 Intel 32 бита) вышеупомянутые работы кода. Или время выполнения не уважает разметки и тихо 'исправляет' вещи, или оно позволяет произвольное выравнивание (исторически, они были менее гибкими, чем время выполнения MS в этом отношении, что удивительно). Промежуточная форма CLI, сгенерированная моно, не включает .unaligned префиксов инструкции, как таковых, это, кажется, не соответствует спецификации.

Это будет учить меня только начинать работу моно.

0
ответ дан 4 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

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