Так, ви можете націлити на 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 є наступним, і , до жаль , це буде вимагати non-VS.NET інструменту: Я віддаю перевагу Caphyon в Advanced Installer для цієї мети, так як він витягає основний трюк залученого (створити загальну MSI, а також 32-бітові і 64-бітні специфічні MSI, і використовувати пусковий інструмент налаштування .EXE, щоб витягти потрібну версію і зробити потрібні виправлення під час виконання) дуже і дуже добре.
Можливо, ви можете домогтися тих же результатів, використовуючи інші інструменти або набір інструментів Windows Installer XML (WiX) , але Advanced Installer робить такі настільки легкими (і цілком доступними для цього), що я ніколи не переглядав альтернативи.
Одне, що вам може знадобитися для WiX, хоча навіть при використанні розширеного інсталятора - це власні дії .NET Installer Class. Хоча тривіально вказати певні дії, які повинні виконуватись лише на певних платформах (відповідно відповідно до умов виконання VersionNT64 та NOT VersionNT64), вбудовані спеціальні дії AI виконуватимуться за допомогою 32-бітного Framework навіть на 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>
Ця умова також зменшується до всіх типів збірки, випуску чи налагодження, і просто вказує архітектуру процесора.