Исключение формата исключенного изображения в 64-битном приложении [дубликат]

Симон Моурир дал этот пример :

object o = null;
DateTime d = (DateTime)o;  // NullReferenceException

, где unboxing преобразование (литье) из object (или из одного из классов System.ValueType или System.Enum или из типа интерфейса) - тип значения (кроме Nullable<>) сам по себе дает NullReferenceException.

В другом направлении конверсия бокса из a Nullable<>, которая имеет HasValue, равную false , на ссылочный тип, может дать ссылку null, которая затем может привести к NullReferenceException. Классический пример:

DateTime? d = null;
var s = d.ToString();  // OK, no exception (no boxing), returns ""
var t = d.GetType();   // Bang! d is boxed, NullReferenceException

Иногда бокс происходит по-другому. Например, с помощью этого не общего метода расширения:

public static void MyExtension(this object x)
{
  x.ToString();
}

следующий код будет проблематичным:

DateTime? d = null;
d.MyExtension();  // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.

Эти случаи возникают из-за специальных правил, используемых во время выполнения при боксе Nullable<> экземпляров.

42
задан David J. Sokol 24 September 2008 в 18:15
поделиться

3 ответа

Вам понадобится загрузить 32-разрядную dll в отдельный 32-разрядный процесс, и ваш 64-битный процесс свяжется с ним через межпроцессное общение. Я не думаю, что в любом случае 32-разрядная dll может быть загружена в 64-разрядный процесс.

Здесь есть довольно хорошая статья:

Доступ 32-разрядные DLL-файлы из 64-битного кода

32
ответ дан John Sibly 1 September 2018 в 03:49
поделиться

Вам необходимо записать исполняемые процессы в виде 32-битных процессов (против любого процессора или x64), чтобы они были загружены с помощью WoW32 для Vista. Это загрузит их в режиме 32-разрядной эмуляции, и у вас не будет проблемы с точкой входа. Вы можете оставить свои библиотеки в режиме AnyCPU, но ваши исполняемые файлы должны быть скомпилированы как x86.

1
ответ дан Orion Adrian 1 September 2018 в 03:49
поделиться
  • 1
    Похоже, они это рассмотрели, но для увеличения потолка памяти требуется 64-битный – John Sibly 25 September 2008 в 12:05
  • 2
    Одна половина верна: 32-битные процессы запускаются на машине x64, если вы их компилируете как x86. Но если ваш исполняемый файл x86, а ваши библиотеки - AnyCPU, то компилятор просто сделает из него код x64, что делает их несовместимыми с исполняемым файлом (32 бит). Итак, все, включая сборки , должны быть либо x86, либо AnyCPU. – Matt 12 October 2012 в 13:20

Ответ Джона правильный, если вы не хотите перекомпилировать существующие DLL; однако это может быть и вариантом для вас.

Наша команда в настоящее время переносит наш код x86 FORTRAN на x64, чтобы увеличить потолок памяти.

0
ответ дан Rob Hunter 1 September 2018 в 03:49
поделиться
  • 1
    это работает до тех пор, пока у вас нет 32-битных сторонних сборок (без исходного кода), которые нужно добавить в качестве ссылки ... – Matt 12 October 2012 в 12:48
Другие вопросы по тегам:

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