ОШИБКА: файл «Microsoft.Management.Infrastructure.Native.dll», предназначенный для «x64», несовместим с целевой платформой проекта «x86» [duplicate]

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

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<> экземпляров.

17
задан Bill the Lizard 21 December 2011 в 13:40
поделиться

4 ответа

MSI, созданный проектом установки (в Visual Studio), может ориентироваться только на одну платформу за раз. Ваш вариант состоит в том, чтобы либо сделать 2 MSI, объединить их вместе и создать настраиваемый установочный загрузочный ленту, который выбирает между ними. Есть некоторые сторонние продукты, например Advanced Installer , например, которые могут сделать это для вас.

11
ответ дан Magnus Johansson 24 August 2018 в 22:24
поделиться

Я тоже столкнулся с этим, и написал сообщение в блоге о моем решении:

  • дефлементирует файл с помощью deflate.exe, называя его другим расширением (например, .x64)
  • добавьте его в свой основной проект в качестве файла содержимого
  • добавьте в свое решение проект пользовательских действий
  • добавьте пользовательские действия в проекты настройки «Установить» пользовательские действия
  • раздуть файл внутри пользовательских действий. Установить метод с помощью
  • System.IO.Compression.DeflateStream (см. Код выше)
  • выполнить

Файл deflate.exe можно загрузить из своего репозитория ] в коде google.

5
ответ дан Daren Thomas 24 August 2018 в 22:24
поделиться

.Net имеет опцию «Любой процессор». Заманчиво думать об этом как о «универсальном» варианте, который будет использовать только меньшие функции x86, но на самом деле он позволяет компилятору JIT на каждой машине выбирать соответствующий тип процессора для этой машины.

Единственный раз, когда вы не должны его использовать, - это знать, что у вас есть зависимости или требования, которые не подходят для одной архитектуры или другой. Например: вы знаете, что вам нужна партия для ram, у вас есть зависимость от 32-разрядной родной DLL или вы хотите предварительно скомпилировать приложение.

Здесь существует опасность, потому что у вас есть зависимость DLL от конкретной платформы. Но у вас есть dll для обоих типов, и кажется, что вы знаете, как выбрать правильный вариант во время выполнения. Так будет ли работать опция «Любой процессор»?

1
ответ дан Joel Coehoorn 24 August 2018 в 22:24
поделиться
  1. Откройте проект развертывания.
  2. В обозревателе решений выберите проект развертывания.
  3. В окне «Свойства» выберите свойство TargetPlatform.
  4. Выберите Itanium для 64-разрядной платформы Intel Itanium или x64 для любой другой 64-разрядной платформы (например, наборы команд AMD64 и EM64T).
  5. Во время установки будет поднята ошибка и установка будет остановлена, если целевой компьютер несовместим с указанной платформой.
-2
ответ дан MOHAMED SAKR 24 August 2018 в 22:24
поделиться
Другие вопросы по тегам:

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