2008-09-28 41 views
103

Tôi có một chút khó khăn về cách thiết lập studio trực quan của tôi để tạo nhiều nhắm mục tiêu.Nhắm mục tiêu cả 32bit và 64bit với Visual Studio trong cùng một giải pháp/dự án

Nền: C# .NET v2.0 với p/gọi vào bên thứ ba 32 bit DLL, SQL nhỏ gọn v3.5 SP1, với dự án Thiết lập. Ngay bây giờ, mục tiêu nền tảng được đặt thành x86 để nó có thể chạy trên Windows x64.

Công ty bên thứ ba vừa phát hành phiên bản 64 bit của tệp DLL của họ và tôi muốn xây dựng một chương trình 64 bit chuyên dụng.

Điều này đặt ra một số câu hỏi mà tôi chưa có câu trả lời. Tôi muốn có cùng một cơ sở mã chính xác. Tôi phải xây dựng với tham chiếu đến một trong 32 bit bộ DLL hoặc 64bit DLL. (Cả bên thứ ba và SQL Server Compact)

Điều này có thể được giải quyết với 2 bộ cấu hình mới (Debug64 và Release64) không?

Tôi phải tạo 2 dự án thiết lập riêng biệt (dự án studio trực quan, không có Wix hoặc bất kỳ tiện ích nào khác), hoặc điều này có thể được giải quyết trong cùng một .msi?

Bất kỳ ý tưởng và/hoặc đề xuất nào sẽ được hoan nghênh.

+0

@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

Trả lời

80

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ý.

+0

Trong Visual Studio 2008, tôi thấy rằng không thể lồng nhau. Giải pháp này hoạt động tốt khi tôi tạo s mới bên dưới nhóm phần còn lại của s. Tôi cũng phải thay đổi x86 thành AnyCPU, điều này có thể liên quan đến lịch sử của dự án cụ thể của tôi. –

+0

Trình cài đặt nâng cao đó trông khá tuyệt vời. – Pat

+0

Đây có thể là một câu hỏi ngớ ngẩn nhưng làm thế nào để bạn có được tập tin để chỉnh sửa nó manualy? – hrh

1

Không chắc chắn về câu trả lời cho câu hỏi của bạn - nhưng nghĩ rằng tôi sẽ chỉ ra nhận xét trong phần Thông tin bổ sung của số SQL Compact 3.5 SP1 download page khi bạn đang xem x64 - hy vọng điều đó sẽ hữu ích.

Do những thay đổi trong SQL Server Compact SP1 và 64-bit phiên bản hỗ trợ bổ sung, cài đặt trực thuộc Trung ương và môi trường chế độ hỗn hợp của phiên bản 32-bit của SQL Server Compact 3.5 và 64-bit phiên bản của SQL Máy chủ Compact 3.5 SP1 có thể tạo ra những gì có vẻ như là các sự cố gián đoạn. Để giảm thiểu tiềm năng cho các cuộc xung đột, và cho phép nền tảng triển khai trung lập của quản lý ứng dụng client, Trung cài đặt phiên bản 64-bit của SQL Server Compact 3.5 SP1 bằng cách sử dụng (MSI) tập tin Windows Installer cũng đòi hỏi cài đặt Phiên bản 32 bit của SQL Server Compact 3.5 SP1 MSI tệp. Đối với các ứng dụng chỉ có yêu cầu phiên bản 64 bit, riêng tư triển khai phiên bản 64 bit SQL Server Compact 3.5 SP1 có thể được sử dụng .

Tôi đọc này là "bao gồm các tệp SQLCE 32 bit cũng như các tệp 64bit" nếu phân phối cho các máy khách 64 bit.

Làm cho cuộc sống thú vị tôi đoán .. phải nói rằng tôi thích dòng "những gì dường như là vấn đề liên tục" ... nghe có vẻ như "bạn đang tưởng tượng mọi thứ, nhưng chỉ trong trường hợp, làm điều này ..."

0

Về câu hỏi cuối cùng của bạn. Nhiều khả năng bạn không thể giải quyết vấn đề này bên trong một MSI đơn lẻ. Nếu bạn đang sử dụng thư mục đăng ký/hệ thống hoặc bất cứ điều gì liên quan, bản thân MSI phải biết điều này và bạn phải chuẩn bị một MSI 64bit để cài đặt đúng trên máy 32 bit.

Có khả năng bạn có thể làm cho sản phẩm của bạn được cài đặt dưới dạng ứng dụng 32 và vẫn có thể chạy nó dưới dạng 64 bit, nhưng tôi nghĩ rằng có thể hơi khó đạt được.

đang được nói rằng tôi nghĩ bạn sẽ có thể giữ một cơ sở mã duy nhất cho mọi thứ. Tại nơi làm việc hiện tại của chúng tôi, chúng tôi đã xoay sở để làm như vậy. (nhưng nó đã mất một số juggling để làm cho tất cả mọi thứ chơi với nhau)

Hy vọng điều này sẽ giúp. Heres một liên kết đến một số thông tin liên quan đến vấn đề 32/64 bit: http://blog.typemock.com/2008/07/registry-on-windows-64-bit-double-your.html

26

Hãy nói rằng bạn có DLL xây dựng cho cả hai nền tảng, và họ đang ở vị trí sau:

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

Bạn chỉ cần chỉnh sửa file csproj của bạn từ này:

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

Để này:

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

Sau đó, bạn có thể xây dựng dự án của mình nhắm mục tiêu cả nền tảng và MSB uild sẽ tìm trong thư mục chính xác cho nền tảng đã chọn.

+0

Điều này sẽ rất tuyệt vời nếu nó hoạt động, nhưng không. Ít nhất là không phải cho tôi. –

+10

Đó có phải là: C: \ whatever \ $ (Nền tảng) \ whatever.dll Andreas

+1

phép lạ đã làm việc này cho tôi, cảm ơn một gói! –

0

Nếu bạn sử dụng Tác vụ tùy chỉnh được viết bằng .NET như một phần của trình cài đặt MSI của bạn thì bạn có vấn đề khác.

'Biến thái' chạy các hành động tùy chỉnh này luôn là 32 bit thì hành động tùy chỉnh của bạn cũng sẽ chạy 32 bit, bất chấp mục tiêu bạn chỉ định. Thông tin

More & một số ninja di chuyển để có được xung quanh (về cơ bản thay đổi MSI sử dụng phiên bản 64 bit của shim này)

Building an MSI in Visual Studio 2005/2008 to work on a SharePoint 64

64-bit Managed Custom Actions with Visual Studio

0

Bạn có thể tạo ra hai giải pháp khác nhau và hợp nhất sau đó! Tôi đã làm điều này cho VS 2010. và nó hoạt động. Tôi đã có 2 giải pháp khác nhau được tạo bởi CMake và tôi đã hợp nhất chúng

0

Bạn có thể sử dụng điều kiện cho ItemGroup để tham chiếu dll trong tệp dự án.
Điều này sẽ khiến studio trực quan kiểm tra lại điều kiện và tham chiếu bất cứ khi nào bạn thay đổi cấu hình hoạt động.
Chỉ cần thêm điều kiện cho mỗi cấu hình.

Ví dụ:

<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> 
    <Reference Include="DLLName"> 
     <HintPath>..\DLLName.dll</HintPath> 
    </Reference> 
    <ProjectReference Include="..\MyOtherProject.vcxproj"> 
     <Project>{AAAAAA-000000-BBBB-CCCC-TTTTTTTTTT}</Project> 
     <Name>MyOtherProject</Name> 
    </ProjectReference> 
    </ItemGroup> 
Các vấn đề liên quan