Vâng, bạn có thể nhắm mục tiêu cả x86 và x64 với cơ sở mã tương tự trong cùng một dự án. Nói chung, mọi thứ sẽ chỉ hoạt động nếu bạn tạo cấu hình giải pháp đúng trong VS.NET (mặc dù P/Invoke cho các DLL hoàn toàn không được quản lý sẽ rất có thể yêu cầu một số mã có điều kiện): các mục mà tôi thấy cần chú ý đặc biệt là:
- Tham chiếu đến các cụm được quản lý bên ngoài có cùng tên nhưng bit riêng cụ thể của chúng (điều này cũng áp dụng cho các cụm liên hợp COM)
- Gói MSI (đã được ghi chú, sẽ cần nhắm mục tiêu x86 hoặc x64)
- Bất kỳ hành động dựa trên lớp học nào của Trình cài đặt .NET tùy chỉnh trong gói MSI của bạn
Vấn đề tham chiếu lắp ráp không thể được giải quyết hoàn toàn trong VS.NET, vì nó sẽ chỉ cho phép bạn thêm một tham chiếu với tên đã cho dự án một lần. Để giải quyết vấn đề này, hãy chỉnh sửa tệp dự án của bạn theo cách thủ công (trong VS, bấm chuột phải vào tệp dự án của bạn trong Solution Explorer, chọn Unload Project, sau đó nhấn chuột phải lần nữa và chọn Edit). Sau khi thêm một tham chiếu đến, nói rằng, phiên bản x86 của một hội đồng, hồ sơ dự án của bạn sẽ chứa một cái gì đó như:
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
Bọc mà tham khảo tag bên trong một thẻ ItemGroup chỉ cấu hình giải pháp áp dụng cho, ví dụ:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<Reference ...>....</Reference>
</ItemGroup>
Sau đó, sao chép và dán toàn bộ thẻ ItemGroup, và chỉnh sửa nó để chứa các chi tiết của DLL 64-bit của bạn, ví dụ:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<Reference Include="Filename, ..., processorArchitecture=AMD64">
<HintPath>C:\path\to\x64\DLL</HintPath>
</Reference>
</ItemGroup>
Sau khi tải lại proje của bạn ct trong VS.NET, hộp thoại Assembly Reference sẽ hơi bối rối bởi những thay đổi này, và bạn có thể gặp phải một số cảnh báo về assembly với bộ xử lý đích sai, nhưng tất cả các build của bạn sẽ hoạt động tốt.
Giải quyết các vấn đề MSI là lên tiếp theo, và không may này sẽ đòi hỏi một công cụ non-VS.NET: Tôi thích Caphyon của Advanced Installer cho mục đích đó, vì nó kéo ra khỏi lừa cơ bản liên quan (tạo ra một MSI phổ biến, cũng như các MSI 32 bit và 64 bit cụ thể và sử dụng trình khởi chạy thiết lập .EXE để trích xuất phiên bản phù hợp và thực hiện các sửa lỗi bắt buộc khi chạy) rất, rất tốt.
Bạn có thể đạt được kết quả tương tự bằng cách sử dụng các công cụ khác hoặc Windows Installer XML (WiX) toolset, nhưng Trình cài đặt nâng cao giúp mọi việc trở nên dễ dàng (và khá hợp lý) mà tôi chưa bao giờ thực sự xem xét lựa chọn thay thế.
Một điều bạn có thể vẫn yêu cầu WiX, mặc dù khi sử dụng Trình cài đặt nâng cao, là dành cho các tác vụ tùy chỉnh .NET Installer Class của bạn.Mặc dù nó tầm thường để chỉ định một số hành động chỉ chạy trên các nền tảng nhất định (sử dụng các điều kiện thực thi VersionNT64 và NOT VersionNT64 tương ứng), các hành động tùy chỉnh AI tích hợp sẽ được thực hiện bằng cách sử dụng Khung 32 bit, ngay cả trên các máy 64 bit .
Điều này có thể được khắc phục trong bản phát hành tương lai, nhưng hiện tại (hoặc khi sử dụng công cụ khác để tạo MSI có cùng vấn đề), bạn có thể sử dụng hỗ trợ hành động tùy chỉnh được quản lý của WiX 3.0 để tạo DLL hành động bit bit thích hợp sẽ được thực hiện bằng cách sử dụng Khung tương ứng.
Chỉnh sửa: kể từ phiên bản 8.1.2, Trình cài đặt nâng cao hỗ trợ chính xác các hành động tùy chỉnh 64 bit. Kể từ khi câu trả lời ban đầu của tôi, giá của nó đã tăng lên khá nhiều, không may, mặc dù nó vẫn còn vô cùng xứng khi so sánh với InstallShield và ilk của nó ...
Edit: Nếu DLL của bạn đã được đăng ký trong GAC, bạn cũng có thể sử dụng các thẻ tham chiếu chuẩn theo cách này (ví dụ: SQLite làm ví dụ):
<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>
Điều kiện cũng được giảm xuống tất cả các loại xây dựng, phát hành hoặc gỡ lỗi và chỉ định kiến trúc bộ vi xử lý.
@Magnus Johansson: bạn có thể sử dụng hai cấu hình để hoàn thành một nửa mục tiêu của bạn. MSI hơi khó hơn một chút. – user7116