У меня есть проект, который строится в 32/64-битном формате и имеет соответствующие 32/64-битные зависимости. Я хочу иметь возможность переключать конфигурации и использовать правильную ссылку, но я не знаю, как указать Visual Studio использовать соответствующую архитектуре зависимость.
Возможно, я ошибаюсь, но я хочу иметь возможность переключаться между x86 и x64 в раскрывающемся списке конфигурации, и чтобы указанная DLL была правильной разрядностью.
.net
visual-studio
64-bit
32bit-64bit
Джонатан Йи
источник
источник
Ответы:
Вот что я сделал в предыдущем проекте, для которого потребуется ручная редакция файла (ов) .csproj. Вам также понадобятся отдельные каталоги для разных двоичных файлов, в идеале - братьев и сестер друг друга, и с тем же именем, что и платформа, на которую вы нацеливаетесь.
После добавления в проект ссылок на одну платформу откройте .csproj в текстовом редакторе. Перед первым
<ItemGroup>
элементом внутри<Project>
элемента добавьте следующий код, который поможет определить, на какой платформе вы работаете (и строите).Затем для ссылок на вашу платформу вы вносите следующие изменения:
Обратите внимание на использование
$(CurrentPlatform)
свойства, которое мы определили выше. Вместо этого вы можете использовать условные выражения для того, какие сборки включать для какой платформы. Вам также может потребоваться:$(PROCESSOR_ARCHITEW6432)
и$(PROCESSOR_ARCHITECTURE)
на,$(Platform)
чтобы рассматривать ТОЛЬКО целевую платформу проектов.Первоначально я написал это для внутренней Wiki на работе, однако я изменил его и опубликовал полный процесс в своем блоге , если вас интересуют подробные пошаговые инструкции.
источник
AFAIK, если вашему проекту требуются ссылки, которые являются 32-разрядными или 64-разрядными (например, сборки COM-взаимодействия), и вы не заинтересованы в ручном редактировании файла .csproj, тогда вам придется создать отдельные 32-разрядные и 64-битные проекты.
Я должен отметить, что следующее решение не проверено, но должно работать. Если вы хотите вручную отредактировать файл .csproj, то вы сможете достичь желаемого результата с помощью одного проекта. Файл .csproj - это просто сценарий MSBuild, поэтому полную ссылку можно найти здесь . Открыв файл .csproj в редакторе, найдите
<Reference>
элементы. Вы должны иметь возможность разделить эти элементы на 3 отдельные группы элементов : ссылки, не зависящие от платформы, ссылки, специфичные для x86, и специфичные для x64 ссылки.Вот пример, который предполагает, что ваш проект настроен с целевыми платформами с именами «x86» и «x64».
Теперь, когда вы устанавливаете конфигурацию сборки проекта / решения для платформы x86 или x64, она должна включать в себя соответствующие ссылки в каждом случае. Конечно, вам нужно будет поиграть с
<Reference>
элементами. Вы даже можете установить фиктивные проекты, в которые вы добавляете ссылки x86 и x64, а затем просто копируете необходимые<Reference>
элементы из этих фиктивных файлов проекта в ваш «настоящий» файл проекта.Изменить 1
Вот ссылка на общие элементы проекта MSBuild, которые я случайно не упомянул в исходном сообщении: http://msdn.microsoft.com/en-us/library/bb629388.aspx
источник
Вы можете использовать условие для ItemGroup для ссылок на dll в файле проекта.
Это заставит Visual Studio повторно проверять условие и ссылки всякий раз, когда вы меняете активную конфигурацию.
Просто добавьте условие для каждой конфигурации.
Пример:
источник
Я ссылаюсь на библиотеки DLL x86, расположенные, например, в \ component \ v3_NET4 в моем проекте. Конкретные библиотеки DLL для x86 / x64 расположены в подпапках с именами «x86» и «x64» соответственно.
Затем я использую сценарий предварительной сборки, который копирует соответствующие библиотеки DLL (x86 / x64) в указанную папку на основе $ (PlatformName).
Работает для меня.
источник
Одна сборка .Net с зависимостями x86 / x64
В то время как все остальные ответы дают вам решение для создания разных сборок в соответствии с платформой, я даю вам возможность иметь только конфигурацию «AnyCPU» и создать сборку, которая работает с вашими dll x86 и x64.
Разрешение правильных x86 / x64-dll во время выполнения
шаги:
<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
Добавьте этот сценарий postbuild в свой запускаемый проект, используйте и измените пути этого сценария, чтобы он копировал все ваши dll x86 / x64 в соответствующие подпапки вашего сборочного bin \ x86 \ bin \ x64 \
xcopy /E /H /R /Y /I /D $(SolutionDir)\YourPathToX86Dlls $(TargetDir)\x86 xcopy /E /H /R /Y /I /D $(SolutionDir)\YourPathToX64Dlls $(TargetDir)\x64
-> Когда вы запустите приложение сейчас, вы получите исключение, что сборка не может быть найдена.
Зарегистрируйте событие AssemblyResolve в самом начале точки входа в ваше приложение.
этим методом:
Преимущества:
Недостатки: - Отсутствие ошибок во время компиляции, когда dll x86 / x64 не совпадают. - Вы все равно должны запустить тест в обоих режимах!
При необходимости создайте второй исполняемый файл, который является эксклюзивным для архитектуры x64, с помощью Corflags.exe в сценарии postbuild.
Другие варианты, которые стоит попробовать: - Вам не понадобится обработчик событий AssemblyResolve, если вы гарантируете, что в противном случае библиотеки DLL будут скопированы в вашу двоичную папку при запуске (Оценить архитектуру процесса -> переместить соответствующие библиотеки DLL из x64 / x86 в папку bin и обратно.) - В установщике оцените архитектуру и удалите двоичные файлы для неправильной архитектуры и переместите правильные в папку bin.
источник
Я столкнулся с той же проблемой и довольно долго искал достойное решение. Большинство людей предлагают ручное редактирование файлов решений Visual Studio, что довольно утомительно, чревато ошибками и сбивает с толку при последующем изучении этих отредактированных файлов в графическом интерфейсе Visual Studio. Когда я уже сдался, решение пришло само. Это очень похоже на то, что Микке рекомендует в своем ответе выше.
В менеджере учетных записей я, как обычно, создал две отдельные цели сборки для платформ x86 и x64. Затем я добавил в свой проект ссылку на сборку x86. На этом этапе я полагал, что проект настроен только для сборки x86 и никогда не будет компилироваться для конфигурации x64, если я не сделаю его ручное редактирование, как это было предложено Хьюго выше.
Через некоторое время я в конце концов забыл об ограничении и случайно начал сборку x64. Конечно, сборка не удалась. Но важным было полученное мной сообщение об ошибке. В сообщении об ошибке говорилось, что сборка, названная точно так же, как моя сборка x86, отсутствует в папке, предназначенной как цель сборки x64 для моего решения.
Заметив это, я вручную скопировал правильную сборку x64 в этот каталог. Слава! Моя сборка x64 чудесным образом увенчалась успехом с правильной сборкой, найденной и неявно связанной. Изменение моего решения и установка целевого каталога сборки для сборки x64 в эту папку заняли считанные минуты. После этих шагов решение автоматически собирается как для x86, так и для x64 без какого-либо ручного редактирования файлов MSBuild.
Подводить итоги:
После выполнения этих шагов ваше решение будет правильно построено для конфигураций x86 и x64.
Это сработало для меня в проекте Visual Studio 2010 .NET 4.0 C #. Очевидно, это своего рода недокументированное внутреннее поведение Visual Studio, которое может быть изменено в версиях 2012, 2013 и 2015 годов. Если кто-то попробует другие версии, поделитесь, пожалуйста, своим опытом.
источник
В итоге я использовал то, что считаю более простым решением, которое является своего рода инверсией решения Микке. Проект представляет собой приложение форм C # Visual Studio 2015 с целями x86 и x64. Я сослался на одну из сборок .NET, я использовал 32-битную. В свойствах ссылки я установил "Копировать локально" в значение false. Затем я просто вручную помещаю соответствующую (32- или 64-разрядную) сборку .Net в каждый целевой каталог. Фактическая разрядность ссылки не имеет значения, если у них одинаковые возможности, поскольку она просто определяет внешний интерфейс. Вы также можете добавить этап копирования после сборки, если хотите пофантазировать. Обратите внимание, что в этом проекте также есть ссылка на COM, работает то же самое. Ссылка определяет объекты / интерфейсы, поэтому разрядность ссылочной DLL не имеет значения. Если зарегистрированы как 32-битные, так и 64-битные библиотеки COM DLL, приложение будет искать в соответствующем месте реестра и создавать правильный 32- или 64-разрядный COM-объект. Работает для меня!
источник