Предназначаясь и для 32 битов и для 64 битов с Visual Studio в том же решении/проекте

110
задан Magnus Johansson 27 July 2012 в 06:30
поделиться

5 ответов

Да, можно быть нацелены на и x86 и для x64 с той же кодовой базой в том же проекте. В целом вещи будут Просто Работать при создании правильных конфигураций решения в VS.NET (хотя P/Invoke к совершенно неуправляемому DLLs, скорее всего, потребует некоторого условного кода): объекты, которые я нашел для требования особого внимания:

  • Ссылки на внешние управляемые сборки с тем же именем, но их собственной определенной разрядностью (это также относится к взаимодействующим с COM блокам)
  • пакет MSI (который, как был уже отмечен, должен будет предназначаться или для x86 или для x64)
  • Любой пользовательский Установщик.NET Основанные на классах действия в Вашем пакете MSI

, проблема ссылки на сборку не может быть решена полностью в рамках VS.NET, поскольку это только позволит Вам добавлять ссылку с именем к проекту однажды. Для работы вокруг этого отредактируйте файл проекта вручную (в VS, щелкните правой кнопкой файлу проекта в Проводнике Решения, выбор Разгружают Проект, затем щелкают правой кнопкой снова и выбирают Редактирование). После добавления ссылки на, скажем, x86 версию блока Ваш файл проекта будет содержать что-то как:

<Reference Include="Filename, ..., processorArchitecture=x86">
  <HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>

Обертка, которую Ссылка отмечает в теге ItemGroup, указывающем на конфигурацию решения, к которой это относится, например:

<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
   <Reference ...>....</Reference>
</ItemGroup>

Затем скопируйте и вставьте весь тег ItemGroup и отредактируйте его для содержания деталей 64-разрядного DLL, например:

<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
  <Reference Include="Filename, ..., processorArchitecture=AMD64">
     <HintPath>C:\path\to\x64\DLL</HintPath>
   </Reference>
</ItemGroup>

После перезагрузки Вашего проекта в VS.NET, диалоговое окно Ссылки на сборку будет немного перепутано этими изменениями, и можно встретиться с некоторыми предупреждениями о блоках с неправильным целевым процессором, но все сборки будут работать просто великолепно.

Решение проблемы MSI закончилось затем, и к сожалению это будет требовать инструмента non-VS.NET: Я предпочитаю Caphyon Усовершенствованный Установщик с этой целью, поскольку он осуществляет, основной включенный прием (создайте общий MSI, а также 32-разрядный и 64-разрядный определенный MSIs, и используйте средство запуска установки.EXE, чтобы извлечь правильную версию и сделать необходимый fixups во времени выполнения), очень, очень хорошо.

можно, вероятно, достигнуть тех же результатов с помощью других инструментов или Windows Installer XML (WiX) комплект инструментальных средств , но Усовершенствованный Установщик делает вещи так легкими (и довольно доступно в этом), что я действительно никогда не смотрел на альтернативы.

Одна вещь Вы можете все еще требовать WiX для хотя, даже когда с помощью Усовершенствованного Установщика, быть для пользовательских действий Класса Установщика.NET. Хотя это тривиально для определения определенных действий, которые должны только работать на определенных платформах (использующий VersionNT64 и НЕ условия выполнения VersionNT64, соответственно), встроенные пользовательские действия AI будут выполняться с помощью 32-разрядной Платформы, даже на 64-разрядных машинах.

Это может быть зафиксировано в будущем выпуске, но на данный момент (или при использовании различного инструмента для создания MSIs, который имеет ту же проблему), можно использовать управляемую поддержку пользовательского действия WiX 3.0's действию по созданию DLLs с надлежащей разрядностью, которая будет выполняться с помощью соответствующей Платформы.

<час>

Редактирование: с версии 8.1.2 Усовершенствованный Установщик правильно поддерживает 64-разрядные пользовательские действия. Начиная с моего исходного ответа его цена увеличилась вполне немного, к сожалению, даже при том, что это - все еще чрезвычайно хорошее значение когда по сравнению с InstallShield и его родом...

<час>

Редактирование: Если Ваши DLLs регистрируются в GAC, можно также использовать стандартные ссылочные теги этот путь (SQLite как пример):

<ItemGroup Condition="'$(Platform)' == 'x86'">
    <Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x64'">
    <Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64" />
</ItemGroup>

условие также уменьшается вниз до всех типов сборки, выпуска или отладки, и просто определяет архитектуру процессора.

82
ответ дан John Baughman 24 November 2019 в 03:16
поделиться

Не уверенный в общем ответе на Ваш вопрос - но думал, что я укажу на комментарий в разделе Additional Information SQL Компактные 3,5 страницы загрузки SP1, видя, что Вы смотрите на x64 - надеются, что это помогает.

из-за изменений в SQL Server Компактный SP1 и дополнительная 64-разрядная поддержка версии, централизованно установленные и смешанные среды режима 32-разрядной версии SQL Server Компактные 3.5 и 64-разрядная версия SQL Server Компактные 3,5 SP1 могут создать то, что, кажется, неустойчивые проблемы. Чтобы минимизировать потенциал для конфликтов и включить независимое от платформы развертывание управляемых клиентских приложений, централизованно устанавливая 64-разрядную версию SQL Server Компактные 3,5 SP1 с помощью Windows Installer (MSI), файл также требует установки 32-разрядной версии SQL Server Компактные 3,5 файла SP1 MSI. Для приложений, которые только требуют собственного 64-разрядного, частного развертывания 64-разрядной версии SQL Server, могут быть использованы, Компактные 3,5 SP1.

я считал это, поскольку "включают, файлы а также , SQLCE на 32 бита файлы на 64 бита" при распределении для клиентов на 64 бита.

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

1
ответ дан gleng 24 November 2019 в 03:16
поделиться

Скажем, у Вас есть сборка DLLs для обеих платформ, и они находятся в следующем месте:

C:\whatever\x86\whatever.dll
C:\whatever\x64\whatever.dll

просто необходимо отредактировать .csproj файл от этого:

<HintPath>C:\whatever\x86\whatever.dll</HintPath>

К этому:

<HintPath>C:\whatever\$(Platform)\whatever.dll</HintPath>

необходимо тогда быть в состоянии разработать проект, предназначающийся для обеих платформ, и MSBuild посмотрит в корректном каталоге для выбранной платформы.

27
ответ дан Kevin Crowell 24 November 2019 в 03:16
поделиться

Относительно Вашего последнего вопроса. Скорее всего, Вы наклоняетесь, решают эту внутреннюю часть единственный MSI. Если Вы используете реестр/системные папки, или что-либо имело отношение, сам MSI должен знать об этом, и необходимо подготовить MSI на 64 бита для надлежащей установки на машине на 32 бита.

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

, что, будучи сказанным я думаю, что необходимо быть в состоянии сохранить единственную кодовую базу для всего. В моем текущем месте работы нам удалось сделать так. (но это сделало взял некоторое манипулирование, чтобы заставить все играть вместе)

Hope, которой это помогает. Вот ссылка на некоторую информацию, связанную с проблемами на 32/64 бита: http://blog.typemock.com/2008/07/registry-on-windows-64-bit-double-your.html

0
ответ дан Lior Friedman 24 November 2019 в 03:16
поделиться

При использовании Пользовательских действий, записанных в.NET как часть установщика MSI тогда, у Вас есть другая проблема.

'контейнер', который выполняет эти пользовательские действия, - всегда 32 бита тогда, Ваше пользовательское действие выполнит 32 бита также, несмотря на то, какую цель Вы определяете.

[еще 114] информация & некоторый ниндзя перемещается для двигений (в основном изменяют MSI для использования версии на 64 бита этого контейнера)

Здание MSI в Visual Studio 2005/2008 для работы над SharePoint 64

64-разрядных Управляемых Пользовательских действий с Visual Studio

0
ответ дан Ryan 24 November 2019 в 03:16
поделиться