2010-09-30 34 views
106

Tôi có một dự án xây dựng trong 32/64-bit và có phụ thuộc 32/64-bit tương ứng. Tôi muốn có thể chuyển đổi cấu hình và có tham chiếu chính xác được sử dụng, nhưng tôi không biết cách nói cho Visual Studio sử dụng sự phụ thuộc phù hợp với kiến ​​trúc.Điều kiện sử dụng tham chiếu bit 32/64 khi xây dựng trong Visual Studio

Có lẽ tôi đang đi về điều này một cách sai, nhưng tôi muốn có thể chuyển đổi giữa x86 và x64 trong trình đơn thả xuống cấu hình, và có DLL tham chiếu là bit đúng.

+0

Rất không rõ ràng, ngôn ngữ này là gì? Dự án DLL có trong giải pháp không? –

+0

Xin lỗi, đây là .NET, tôi đang viết bằng C#. –

+3

Ok, tôi đã giải quyết nó bằng một giải pháp câm: Tạo tệp csproj bổ sung chỉ tham chiếu đến tệp x64 DLL (và đã xóa cấu hình x86 khỏi csproj). Nó hoạt động, nhưng nếu ai đó có một giải pháp thanh lịch hơn mà không liên quan đến một csproj bổ sung, tôi rất muốn nhìn thấy nó. –

Trả lời

91

Dưới đây là những gì tôi đã làm trong một dự án trước đó, sẽ yêu cầu phiên bản thủ công của tệp .csproj. Bạn cũng cần các thư mục riêng biệt cho các tệp nhị phân khác nhau, các anh chị em lý tưởng của nhau và có cùng tên với nền tảng bạn đang nhắm mục tiêu.

Sau khi thêm tài liệu tham khảo của một nền tảng duy nhất vào dự án, hãy mở tệp .csproj trong trình chỉnh sửa văn bản. Trước phần tử <ItemGroup> đầu tiên trong phần tử <Project>, hãy thêm mã sau, sẽ giúp xác định nền tảng bạn đang chạy (và đang xây dựng) trên đó.

<!-- Properties group for Determining 64bit Architecture --> 
<PropertyGroup> 
    <CurrentPlatform>x86</CurrentPlatform> 
    <CurrentPlatform Condition="'$(PROCESSOR_ARCHITECTURE)'=='AMD64' or '$(PROCESSOR_ARCHITEW6432)'=='AMD64'">AMD64</CurrentPlatform> 
</PropertyGroup> 

Sau đó, để tham khảo cụ thể nền tảng của bạn, bạn thực hiện những thay đổi như sau:

<ItemGroup> 
    <Reference Include="Leadtools, Version=16.5.0.0, Culture=neutral, PublicKeyToken=9cf889f53ea9b907, processorArchitecture=x86"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\..\Lib\Leadtools\$(CurrentPlatform)\Leadtools.dll</HintPath> 
    </Reference> 
    <Reference Include="Leadtools.Codecs, Version=16.5.0.0, Culture=neutral, PublicKeyToken=9cf889f53ea9b907, processorArchitecture=x86"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\..\Lib\Leadtools\$(CurrentPlatform)\Leadtools.Codecs.dll</HintPath> 
    </Reference> 
    <Reference Include="Leadtools.ImageProcessing.Core, Version=16.5.0.0, Culture=neutral, PublicKeyToken=9cf889f53ea9b907, processorArchitecture=x86"> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>..\..\Lib\Leadtools\$(CurrentPlatform)\Leadtools.ImageProcessing.Core.dll</HintPath> 
    </Reference> 
    <Reference Include="System" /> 
    <Reference Include="System.Core" /> 
    <Reference Include="System.Data.Entity" /> 
    <!-- Other project references --> 
</ItemGroup> 

Lưu ý việc sử dụng các $(CurrentPlatform) bất động sản, mà chúng tôi định nghĩa ở trên. Thay vào đó, bạn có thể sử dụng các điều kiện để hội đồng nào bao gồm nền tảng nào.Bạn cũng có thể cần phải hoặc là một trong hai:

  • Thay $(PROCESSOR_ARCHITEW6432)$(PROCESSOR_ARCHITECTURE) với $(Platform) để xem xét CHỈ nền tảng mục tiêu của dự án
  • Alter logic quyết nền tảng để có phù hợp với máy tính hiện hành, do đó bạn không xây dựng/tham chiếu một nhị phân 64 bit để thực thi trên nền tảng 32 bit.

Tôi đã viết thư này ban đầu cho một Wiki nội bộ tại nơi làm việc, tuy nhiên, tôi đã sửa đổi nó và đăng full process to my blog, nếu bạn quan tâm đến các hướng dẫn từng bước chi tiết.

+1

Đẹp. Tôi đã đi với việc sử dụng một điều kiện trên ItemGroup theo đề nghị dưới đây nhưng sử dụng $ (PROCESSOR_ARCHITEW6432) và $ (PROCESSOR_ARCHITECTURE) cho các điều kiện như ở đây. Một lưu ý là tôi tìm thấy $ (PROCESSOR_ARCHITECTURE) trả về x86 trên cả hai nền tảng 32 và 64 bit nhưng $ (PROCESSOR_ARCHITEW6432) trả về AMD64 chỉ trên 64bit. Một cái gì đó cần lưu ý nếu bạn cố gắng thử nghiệm cho x86 (vì AMD64 là một dẫn xuất của x86 tôi giả định). – tjmoore

+0

Cảm ơn thông tin đó @tjmoore. Bạn đã chú ý đến O/S nào? Tôi chỉ kiểm tra lại của tôi một lần nữa (Win7SP1) và nói AMD64 cho $ (PROCESSOR_ARCHITECTURE), nhưng chắc chắn muốn có thông tin đầy đủ và kỹ lưỡng nhất có thể. – Hugo

+7

Vui, tìm kiếm của tôi đưa tôi đến đây và tôi chỉ cần điều này vì tôi cũng đang sử dụng LeadTools ... +1 –

47

AFAIK, nếu dự án của bạn yêu cầu tham chiếu 32 bit hoặc 64 bit cụ thể (nghĩa là hội đồng COM-interop) và bạn không quan tâm đến việc chỉnh sửa thủ công tệp .csproj, thì bạn sẽ phải tạo riêng Dự án 32 bit và 64 bit.

Tôi nên lưu ý rằng giải pháp sau đây chưa được kiểm tra, nhưng sẽ hoạt động. Nếu bạn sẵn sàng chỉnh sửa thủ công tệp .csproj, thì bạn sẽ có thể đạt được kết quả mong muốn với một dự án duy nhất. Tệp .csproj chỉ là tập lệnh MSBuild, do đó, để tham khảo đầy đủ, hãy xem here. Khi bạn mở tệp .csproj trong trình chỉnh sửa, hãy tìm các phần tử <Reference>. Bạn có thể chia các phần tử này ra thành 3 khác biệt item groups: các tham chiếu không phải là các tham chiếu cụ thể theo nền tảng, x86 và tham chiếu cụ thể về x64.

Dưới đây là một ví dụ, cho rằng dự án của bạn được cấu hình với nền tảng mục tiêu có tên là "x86" và "x64"

<!-- this group contains references that are not platform specific --> 
<ItemGroup> 
    <Reference Include="System" /> 
    <Reference Include="System.Core" /> 
    <!-- any other references that aren't platform specific --> 
</ItemGroup> 

<!-- x86 specific references --> 
<ItemGroup Condition=" '$(Platform)' == 'x86' "> 
    <Reference Include="MyComAssembly.Interop"> 
     <HintPath>..\..\lib\x86\MyComAssembly.Interop.dll</HintPath> 
    </Reference> 

    <!-- any additional x86 specific references --> 
</ItemGroup> 

<!-- x64 specific referneces --> 
<ItemGroup Condition=" '$(Platform)' == 'x64' "> 
    <Reference Include="MyComAssembly.Interop"> 
     <HintPath>..\..\lib\x64\MyComAssembly.Interop.dll</HintPath> 
    </Reference> 

    <!-- any additional x64 specific references --> 
</ItemGroup> 

Bây giờ, khi bạn thiết lập cấu hình dự án/giải pháp xây dựng của bạn để nhắm mục tiêu x86 hoặc x64 nền tảng , nó phải bao gồm các tham chiếu thích hợp trong mỗi trường hợp. Tất nhiên, bạn sẽ cần phải chơi xung quanh với các yếu tố <Reference>. Bạn thậm chí có thể thiết lập các dự án giả, nơi bạn thêm các tham chiếu x86 và x64, và sau đó chỉ cần sao chép các phần tử <Reference> cần thiết từ các tệp dự án giả này vào tệp dự án "thực" của bạn.


Sửa 1
Dưới đây là một liên kết đến các hạng mục công trình MSBuild chung, mà tôi vô tình bỏ khỏi bài đăng gốc: http://msdn.microsoft.com/en-us/library/bb629388.aspx

+0

Câu trả lời xuất sắc !! Lưu ngày của tôi! Cảm ơn rất nhiều. – hellodear

7

Tôi đang tham khảo các tệp x86, nằm ở ví dụ: \ component \ v3_NET4, trong dự án của tôi. Các DLL cụ thể cho x86/x64 được đặt trong các thư mục con có tên là "x86" và "x64" resp.

Sau đó, tôi đang sử dụng tập lệnh dựng sẵn sao chép các tệp DLL thích hợp (x86/x64) vào thư mục được tham chiếu, dựa trên $ (Tên nền tảng).

xcopy /s /e /y "$(SolutionDir)..\component\v3_NET4\$(PlatformName)\*" "$(SolutionDir)..\component\v3_NET4" 

trình cho tôi.

15

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> 
+1

Điều này thật tuyệt vời! Điều này chắc chắn sẽ là giải pháp được chấp nhận! – ManicBlowfish

+0

Nghiêm túc, câu trả lời này tốt hơn và đơn giản hơn là câu trả lời được chấp nhận. – Yandros

+0

Có bình thường khi có các mục trùng lặp trong Tài liệu tham khảo sau khi thực hiện việc này không? – natenho

2

tôi phải đối mặt với cùng một vấn đề và dành nhiều thời gian tìm kiếm một giải pháp phù hợp. Hầu hết mọi người cung cấp chỉnh sửa thủ công các tệp giải pháp Visual Studio, khá tẻ nhạt, dễ bị lỗi và gây nhầm lẫn khi khám phá các tệp đã chỉnh sửa này trong Visual Studio GUI sau đó. Khi tôi đã từ bỏ, giải pháp đã xuất hiện. Nó rất giống với những gì Micke đề xuất trong câu trả lời ở trên.

Trong trình quản lý tài khoản, tôi đã tạo hai mục tiêu xây dựng riêng biệt cho nền tảng x86 và x64, như thường lệ. Tiếp theo, tôi đã thêm một tham chiếu đến x86 assembly vào dự án của tôi. Về điểm này, tôi tin rằng dự án được cấu hình để xây dựng x86 chỉ và sẽ không bao giờ xây dựng cho cấu hình x64, trừ khi tôi sẽ thực hiện chỉnh sửa thủ công của nó theo đề xuất của Hugo ở trên.

Sau một thời gian, cuối cùng tôi đã quên giới hạn và vô tình bắt đầu xây dựng x64. Tất nhiên, việc xây dựng thất bại. Nhưng quan trọng là thông báo lỗi tôi nhận được. Thông báo lỗi cho biết rằng assembly được đặt tên chính xác như assembly x86 được tham chiếu của tôi bị thiếu trong thư mục được dự định là x64 build target cho giải pháp của tôi.

Sau khi nhận thấy điều này, tôi đã sao chép thủ công x64 phù hợp vào thư mục này. Vinh quang! X64 của tôi xây dựng một cách kỳ diệu thành công với lắp ráp thích hợp được tìm thấy và liên kết ngầm. Đó là vấn đề của phút để sửa đổi giải pháp của tôi để thiết lập một thư mục mục tiêu xây dựng cho x64 lắp ráp vào thư mục này. Sau khi các bước giải pháp xây dựng tự động cho cả x86 và x64 mà không cần chỉnh sửa thủ công các tệp MSBuild.

Tóm lại:

  1. Tạo x86 và x64 mục tiêu trong một dự án duy nhất
  2. Thêm tất cả tài liệu tham khảo dự án thích hợp để lắp ráp x86
  3. Đặt thư mục mục tiêu một chung xây dựng cho tất cả các assembly x64
  4. Trong trường hợp bạn đã sẵn sàng lắp ráp x64, chỉ cần sao chép chúng một lần vào thư mục đích xây dựng x64 của bạn

Sau khi hoàn thành các bước này, giải pháp của bạn sẽ xây dựng đúng cho cả cấu hình x86 và x64.

Điều này làm việc cho tôi trên dự án Visual Studio 2010 .NET 4.0 C#. Rõ ràng, đây là một loại hành vi nội bộ không có giấy tờ của Visual Studio, có thể thay đổi trong các phiên bản 2012, 2013 và 2015. Nếu ai đó sẽ thử trên các phiên bản khác, hãy chia sẻ kinh nghiệm của bạn.

Các vấn đề liên quan