Có, bạn có thể nhắm mục tiêu cả x86 và x64 với cùng một cơ sở mã 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 phù hợp trong VS.NET (mặc dù P / Gọi đến các tệp DLL hoàn toàn không được quản lý rất có thể sẽ 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 hội đồng được quản lý bên ngoài có cùng tên nhưng có bit cụ thể của riêng chúng (điều này cũng áp dụng cho các hội đồng liên kết COM)
- Gói MSI (như đã được lưu ý, sẽ cần nhắm mục tiêu x86 hoặc x64)
- Mọi hành động dựa trên Lớp trình cài đặt .NET tùy chỉnh trong gói MSI của bạn
Vấn đề tham chiếu hợp ngữ 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 có tên đã cho vào một 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, nhấp chuột phải vào tệp dự án của bạn trong Trình khám phá giải pháp, chọn Dỡ tải dự án, sau đó nhấp chuột phải một lần nữa và chọn Chỉnh sửa). Sau khi thêm tham chiếu tới, chẳng hạn như phiên bản x86 của một assembly, tệp 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>
Gói thẻ Tham chiếu đó bên trong thẻ ItemGroup cho biết cấu hình giải pháp mà nó áp dụng, 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 dự án của bạn trong VS.NET, hộp thoại Tham chiếu lắp ráp sẽ hơi bối rối bởi những thay đổi này và bạn có thể gặp một số cảnh báo về các hợp ngữ với bộ xử lý đích sai, nhưng tất cả các bản dựng của bạn sẽ hoạt động tốt.
Việc giải quyết vấn đề MSI sẽ diễn ra tiếp theo, và rất tiếc điều này sẽ yêu cầu công cụ không phải VSNET: Tôi thích Trình cài đặt nâng cao của Caphyon cho mục đích đó, vì nó giải quyết thủ thuật cơ bản liên quan (tạo một MSI chung, cũng như 32-bit và các MSI 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 bản sửa lỗi cần thiết trong thời gian chạy) 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 bộ công cụ Windows Installer XML (WiX) , nhưng Advanced Installer làm cho mọi thứ trở nên dễ dàng (và giá cả khá phải chăng) mà tôi chưa bao giờ thực sự xem xét các lựa chọn thay thế.
Một điều mà bạn có thể vẫn yêu cầu WiX, ngay cả khi sử dụng Advanced Installer, là cho các hành động tùy chỉnh .NET Installer Class của bạn. Mặc dù việc chỉ định các hành động nhất định chỉ nên chạy trên một số nền tảng nhất định (tương ứng là sử dụng điều kiện thực thi VersionNT64 và NOT VersionNT64) là rất nhỏ, nhưng các hành động tùy chỉnh AI tích hợp sẽ được thực thi bằng Framework 32 bit, ngay cả trên máy 64 bit .
Điều này có thể được khắc phục trong bản phát hành trong tương lai, nhưng hiện tại (hoặc khi sử dụng một công cụ khác để tạo MSI của bạn gặp phải vấn đề tương tự), 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 các tệp DLL hành động với độ bit thích hợp sẽ được thực thi bằng Framework tương ứng.
Chỉnh sửa: kể từ phiên bản 8.1.2, Advanced Installer hỗ trợ chính xác các hành động tùy chỉnh 64-bit. Kể từ câu trả lời ban đầu của tôi, giá của nó đã tăng lên khá nhiều, thật không may, mặc dù nó vẫn có giá trị cực kỳ tốt khi so sánh với InstallShield và ilk của nó ...
Chỉnh sửa: Nếu các tệp 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 tiêu chuẩn theo cách này (ví dụ về 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>
Điều kiện cũng được giảm xuống cho tất cả các loại xây dựng, phát hành hoặc gỡ lỗi và chỉ xác định kiến trúc bộ xử lý.