Как исправить ошибку компиляции Visual Studio, «несоответствие между архитектурой процессора»?

Я новичок в настройке проекта в Visual Studio 2010, но я провел некоторое исследование и до сих пор не могу понять эту проблему. У меня есть решение Visual Studio с C ++ DLL, ссылающееся на C # DLL. C # DLL ссылается на несколько других DLL, некоторые в моем проекте и на некоторые внешние. Когда я пытаюсь скомпилировать C ++ DLL, я получаю это предупреждение:

предупреждение MSB3270: между процессорной архитектурой проекта, создаваемого «MSIL», и процессорной архитектурой ссылки «[внутренняя C # dll]», «x86» было несоответствие между архитектурой процессора.

Он предлагает мне перейти в Configuration Manager для выравнивания моих архитектур. C # DLL настроена с целевой платформой x86. Если я попытаюсь изменить это на что-то другое, например Any CPU, он жалуется, потому что одна из внешних DLL, от которой он зависит, имеет платформу target x86.

Когда я смотрю на Configuration Manager, он показывает платформу для моей C # DLL как x86 и для моего проекта на C ++ как Win32. Это похоже на правильную настройку; конечно, я не хочу, чтобы проект моего проекта на C ++ имел платформу, установленную на x64, что является единственным другим вариантом.

Что я здесь делаю неправильно?

Это предупреждение, похоже, было введено с новой версией Visual Studio 11 Beta и .NET 4.5, хотя я предполагаю, что это возможно было раньше.

Во-первых, это просто предупреждение. Это не должно повредить ничего, если вы просто имеете дело с зависимостями x86. Microsoft просто пытается предупредить вас, когда вы заявляете, что ваш проект совместим с «Any CPU», но у вас есть зависимость от сборки проекта или .dll, которая является либо x86, либо x64. Поскольку у вас есть зависимость x86, технически ваш проект, следовательно, не совместим с любым «процессором». Чтобы предупредить об этом, вы должны фактически изменить свой проект с «Любой процессор» на «x86». Это очень легко сделать, вот шаги.

  1. Перейдите в пункт меню «Конфигурация сборки».
  2. Найдите свой проект в списке, в разделе «Платформа» он скажет «Любой процессор»,
  3. Выберите опцию «Любой процессор» в раскрывающемся списке, а затем выберите
  4. В этом диалоговом окне выберите x86 из раскрывающегося списка «Новая платформа» и убедитесь, что в раскрывающемся списке «Копирование настроек из» выбран «Любой процессор».
  5. Нажмите ОК
  6. Вы захотите выбрать x86 для конфигураций Debug и Release.

Это заставит предупреждение уйти, а также сообщит, что ваша assembly или проект теперь больше не совместимы с любым «процессором», а теперь специфичны для x86. Это также применимо, если вы создаете 64-битный проект с зависимостью x64; вы просто выберете x64 вместо этого.

Еще одно замечание: проекты могут быть совместимы с любым «процессором», если они являются чистыми проектами .NET. Эта проблема возникает только в том случае, если вы вводите зависимость (сторонняя dll или собственный проект на C ++), предназначенный для конкретной архитектуры процессора.

Это очень упрямое предупреждение, и хотя это действительное предупреждение, есть некоторые случаи, когда его невозможно разрешить из-за использования сторонних компонентов и других причин. У меня есть аналогичная проблема, за исключением того, что предупреждение связано с тем, что моя платформа проектов – AnyCPU, и я ссылаюсь на библиотеку MS, созданную для AMD64. Это, кстати, и в Visual Studio 2010, и, как представляется, она вводится путем установки VS2012 и .Net 4.5.

Поскольку я не могу изменить библиотеку MS, на которую я ссылаюсь, и поскольку я знаю, что моя целевая среда развертывания будет только когда-либо 64-битной, я могу смело игнорировать эту проблему.

Как насчет предупреждения? Microsoft сообщила в ответ на сообщение Connect, что один из вариантов – отключить это предупреждение. Вы должны только это сделать, так что вы прекрасно понимаете свою архитектуру решения и полностью понимаете цель развертывания и знаете, что это не проблема вне среды разработки.

Вы можете отредактировать файл проекта и добавить эту группу свойств и установить для отключения предупреждения:

  None  

Хорошим правилом является «открытые DLL, закрытые EXE», то есть:

  • EXE нацелен на ОС, указав x86 или x64.
  • DLL остаются открытыми (т.е. AnyCPU), поэтому они могут быть созданы в 32-разрядном или 64-битном режиме.

Когда вы создаете EXE как AnyCPU, все, что вы делаете, откладывает решение о том, какая битность процесса будет использоваться для ОС, что сделает JIT EXE по своему вкусу. То есть, операционная система x64 создаст 64-разрядный процесс, операционная система x86 создаст 32-битный процесс.

Создание DLL как AnyCPU делает их совместимыми с любым процессом.

Подробнее о тонкостях загрузки сборки см. Здесь . В исполнительном резюме говорится следующее:

  • AnyCPU – загружается как assembly x64 или x86, в зависимости от процесса вызова
  • x86 – загружается как assembly x86; не будет загружаться из процесса x64
  • x64 – загружается как assembly x64; не будет загружаться из процесса x86

C # DLL настроена с целевой платформой x86

Какая проблема, DLL на самом деле не может выбрать, какой будет биттичность процесса. Это полностью определяется проектом EXE, это первая assembly, которая загружается, поэтому ее целевой настройкой платформы является та, которая учитывает и устанавливает битту для процесса.

У библиотек DLL нет выбора, они должны быть совместимы с битовым процессом. Если это не так, вы получите большой Kaboom с исключением BadImageFormatException, когда ваш код попытается их использовать.

Поэтому хорошим выбором для DLL является AnyCPU, поэтому они работают в любом случае. Это очень полезно для C # DLL, они работают в любом случае. Но, конечно, не ваш DLL смешанного режима C ++ / CLI, он содержит неуправляемый код, который может работать только при запуске процесса в 32-битном режиме. Вы можете заставить систему сборки генерировать предупреждения об этом. Это именно то, что у вас есть. Просто предупреждения, он по-прежнему строит правильно.

Просто подтяните проблему. Установите целевую платформу платформы EXE для x86, она не будет работать ни с какой другой настройкой. И просто сохраняйте все DLL-проекты в AnyCPU.

В дополнение к ответу Дэвида Сакса, вам также может потребоваться перейти на вкладку « Build » Project Properties и установить Platform Target для x86 для проекта, который дает вам эти предупреждения. Хотя вы можете ожидать, что этот параметр, похоже, не идеально синхронизирован с настройкой в ​​диспетчере конфигурации.

Сегодня у меня была эта проблема, и просто посмотреть на конфигурацию здания в Visual Studio не помогло, потому что она показала любой процессор как для проекта, который не строился, так и для проекта, на который делается ссылка.

Затем я посмотрел в csproj упомянутого проекта и нашел следующее:

  pdbonly true bin\Release\ TRACE prompt 4 x64 

Как-то эта платформа PlatformTarget добавлена ​​в середине изменения конфигурации, и среда IDE, похоже, не видит ее.

Удаление этой строки из ссылочного проекта решило мою проблему.

Для проектов C # цель x86 делает то, на что это похоже. В нем говорится, что эта assembly поддерживает только архитектуры x86. Аналогично для x64. С другой стороны, любой процессор говорит, что мне все равно, какая архитектура, я поддерживаю оба. Итак, следующие два вопроса: (1) какова конфигурация исполняемого файла, который использует эти DLL? и (2) какова битость вашей ОС / компьютера? Причина, по которой я спрашиваю, заключается в том, что если ваш исполняемый файл скомпилирован для работы в 64-разрядной версии, тогда ему необходимо, чтобы все зависимости могли работать в 64-разрядном режиме. Ваша assembly процессора должна быть загружена, но, возможно, она ссылается на другую зависимость, которая может работать только в конфигурации x86. Проверьте все зависимости и зависимости зависимостей, чтобы убедиться, что все либо «Любой процессор», либо «x64», если вы планируете запускать исполняемый файл в 64-разрядном режиме. В противном случае у вас будут проблемы.

Во многих отношениях Visual Studio не позволяет легко компилировать смесь любого CPU и различных архитектурных сборок. Это выполнимо, но часто требуется, чтобы assembly, которая в противном случае была бы «Any CPU», должна быть скомпилирована отдельно для x86 и x64, потому что какая-то зависимость от зависимостей имеет две версии.

Если ваша C # DLL имеет зависимости от x86, то ваша DLL сама по себе должна быть x86. Я не вижу в этом ничего общего. VS жалуется на его изменение (например) x64, потому что 64-разрядный исполняемый файл не может загружать 32-разрядные библиотеки.

Я немного смущен конфигурацией проекта C ++. Предупреждающее сообщение, которое было предоставлено для сборки, предполагает, что оно предназначалось для AnyCPU, поскольку оно сообщило, что платформа, на которую он нацелился, был [MSIL], но вы указали, что конфигурация для проекта была фактически Win32. Собственное приложение Win32 не должно включать MSIL – хотя, вероятно, для поддержки взаимодействия с библиотекой C #, вероятно, потребуется поддержка CLR. Поэтому я думаю, что на информационной стороне есть несколько пробелов.

Могу ли я с уважением спросить вас об обзоре и более подробно описать точную конфигурацию проектов и то, как они взаимосвязаны? Будьте рады помочь, если это возможно.

Раньше у меня была аналогичная проблема, особенно при добавлении тестового решения к существующему решению x64, например SharePoint. В моем случае это, похоже, связано с тем, что некоторые шаблоны проектов по умолчанию добавляются как определенные платформы.

Вот решение, которое часто работает для меня: установите все на правильную платформу в Configuration Manager (раскрывающийся список активной конфигурации, обычно говорит, что Debug – это хороший способ добраться до него) и платформу проекта (в свойствах проекта), затем а затем установите все в AnyCPU. Иногда мне приходится удалять и повторно добавлять некоторые зависимости (библиотеки DLL в свойствах каждого проекта), а иногда «Запуск тестов в 32-разрядном или 64-битном процессе» (дважды щелкните «Локальные настройки» и перейдите на «Хосты»).

Мне кажется, что это только что-то установило, а затем вернуло его, но, вероятно, больше происходит за кулисами, которые я не вижу. В прошлом он работал довольно последовательно для меня.

Для моего проекта у меня есть требование, чтобы иметь возможность создавать как x86, так и x64. Проблема заключается в том, что всякий раз, когда вы добавляете ссылки при использовании одного, тогда он жалуется, когда вы строите другой.

Мое решение состоит в том, чтобы вручную отредактировать файлы * .csproj, чтобы такие строки выглядели следующим образом:

    

измените это:

  

Вы также можете получить это предупреждение для сборок MS Fakes, которые не так легко разрешить, поскольку команда f.csproj построена по команде. К счастью, Faces xml позволяет вам добавить его туда .

Я получал то же предупреждение, что и сделал это:

  1. выгружать проект
  2. редактировать свойства проекта, т.е. .csproj
  3. добавьте следующий тег:

       None   
  4. Перезагрузить страницу

Должен быть способ сделать .NET-EXE / DLL AnyCPU и любые неуправляемые DLL-файлы, которые он может скомпилировать как с x86, так и x64, как в комплекте, возможно с разными именами файлов, так и с .NET-модулем, динамически загружающим правильный, в зависимости от его времени выполнения архитектуры процессора. Это сделает AnyCPU мощным. Если C ++ DLL поддерживает только x86 или x64, то AnyCPU, конечно, бессмысленна. Но связанная с этим идея, которую я еще не видел, реализованная в качестве диспетчера конфигурации, даже не предоставляет средства для создания одного и того же проекта в два раза с другой конфигурацией / платформой для множественного связывания, что позволяет использовать AnyCPU или даже другие концепции, такие как любая конфигурация.

У меня была аналогичная проблема, вызванная MS DLL Test DLL. Мое приложение WPF было скомпилировано как x86, но модульная тестовая DLL (ссылка на EXE-файл) как «Любой процессор». Я сменил модульную тестовую DLL, которая будет скомпилирована для x86 (такая же, как EXE), и она была заменена.

У меня было очень похожее предупреждение в моей сборке. Мои проекты были настроены на целевой .NET 4.5, на сервере сборки был установлен SDK для Windows 8.1 (для .NET 4.5.1). После обновления моих проектов для целевой .NET 4.5.1 (для меня это не проблема, было для совершенно нового приложения), я больше не получил предупреждения …

Я решил это предупреждение, изменив «Configuration Manager» на Release (Mixed Plataform).

Я получил это предупреждение в Visual Studio 2012 при компилировании задачи сценария сценария SSIS SQL Server 2012 с пакетом обновления 1 (SP1) – пока не установил SQL Server 2012 SP2.

У меня была такая же проблема с открытием SQLite, и с помощью Nuget и установки компонента, используемого в проекте (SQLite), было исправлено это! попробуйте установить компонент таким образом и проверьте результат

  • Отладка / загрузка Visual Studio очень медленно
  • Использовать преобразование web.config Visual Studio для отладки
  • Visual Studio (2008) «Чистое решение»
  • VS2010 Как включить файлы в проект, скопировать их для автоматического создания выходного каталога во время сборки или публикации
  • Как подключиться к LocalDB в Visual Studio Server Explorer?
  • условные ссылки visual studio 2010
  • Ссылка на system.management.automation.dll в Visual Studio
  • Поддерживает ли Microsoft Visual Studio 2010 c99?
  • #define NOMINMAX с использованием std :: min / max
  • Нет IntelliSense для C ++ / CLI в Visual Studio 2010?
  • rvalue to lvalue conversion Visual Studio
  • Interesting Posts

    Autohotkey – установить горячую клавишу для переключения (отключено с помощью сценария автозапуска дыр)

    C ++: Аргумент «Передано по ссылке»

    когда вызывается цикл $ digest?

    Введите ключевое слово в C #

    Включить удаленные подключения tcp \ ip к серверу sql. Экспресс уже установленная firebase database с кодом или скриптом (запрос)

    Как преобразовать String в BigInteger?

    Файл Android APK: перезапустите старый файл APK в Google Play Store

    Является ли двойное умножение разбитым в .NET?

    Почему и как C # разрешает доступ к закрытым переменным вне самого classа, когда он находится в пределах одного и того же classа?

    Почему Word 2010 создает такие огромные файлы PDF?

    Настройка VS Intellisense для вызовов ядра CUDA

    Svchost.exe – высокая память – wuauserv

    Автозапуск не работает – CD-ROM и USB-накопитель

    DD-WRT: головные боли dnsmasq со статическими хостами

    Зачем использовать значение неиспользуемого значения функции для void?

    Давайте будем гением компьютера.