Да, вы можете использовать как x86, так и x64 с одной и той же кодовой базой в одном проекте. В общем, все будет работать просто, если вы создадите правильные конфигурации решений в VS.NET (хотя P / Invoke для полностью неуправляемых DLL-библиотек, скорее всего, потребует некоторого условного кода): элементы, которые я обнаружил, требующие особого внимания:
- Ссылки на внешние управляемые сборки с тем же именем, но с собственным битом (это также относится к сборкам взаимодействия COM)
- Пакет MSI (который, как уже отмечалось, должен быть нацелен либо на x86, либо на x64)
- Любые пользовательские действия на основе классов .NET Installer в вашем пакете MSI
Проблема со ссылкой на сборку не может быть полностью решена в VS.NET, поскольку она позволит вам добавить ссылку с заданным именем в проект только один раз. Чтобы обойти это, отредактируйте файл проекта вручную (в VS щелкните правой кнопкой мыши файл проекта в обозревателе решений, выберите «Выгрузить проект», затем снова щелкните правой кнопкой мыши и выберите «Изменить»). После добавления ссылки, скажем, на версию сборки x86, ваш файл проекта будет содержать что-то вроде:
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
Оберните этот тег 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, и, к сожалению, для этого потребуется не-VS.NET-инструмент: для этой цели я предпочитаю Advanced Installer от Caphyon, так как он выполняет базовый прием (создание общего MSI, а также 32-битных и 64-битных MSI и использование установщика .EXE для извлечения нужной версии и выполнения необходимых исправлений во время выполнения) очень и очень хорошо.
Вероятно, вы можете достичь тех же результатов, используя другие инструменты или набор инструментов Windows Installer XML (WiX) , но Advanced Installer делает вещи настолько простыми (и в то же время вполне доступными), что я никогда по-настоящему посмотрел на альтернативы.
Одна вещь, которую вам может по-прежнему требуется WiX, хотя, даже при использовании расширенного установщика, это для пользовательских действий .NET Installer Class. Хотя указывать определенные действия, которые должны выполняться только на определенных платформах (тривиально с использованием условий выполнения VersionNT64 и NOT VersionNT64, соответственно), тривиально, встроенные пользовательские действия AI будут выполняться с использованием 32-разрядной платформы даже на 64-разрядных компьютерах. .
Это может быть исправлено в будущем выпуске, но сейчас (или при использовании другого инструмента для создания ваших MSI с такой же проблемой) вы можете использовать управляемую поддержку настраиваемых действий WiX 3.0 для создания DLL-файлов действий с правильная битность, которая будет выполнена с использованием соответствующей Framework.
Редактировать: начиная с версии 8.1.2, Advanced Installer правильно поддерживает 64-битные пользовательские действия. Со времени моего первоначального ответа, к сожалению, его цена немного выросла, хотя по сравнению с InstallShield и ему подобным он все еще остается очень хорошим ...
Редактировать: Если ваши DLL зарегистрированы в 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>
Условие также сводится ко всем типам сборки, выпуска или отладки, и просто указывает архитектуру процессора.