2009-02-10 31 views
9

Tôi có giải pháp C# .net và tôi muốn tạo hai bản dựng khác nhau: một hỗ trợ IE6 và một hỗ trợ IE7. Một vài tệp trong một dự án của tôi khác với bản dựng IE6 so với bản dựng IE7, vì vậy tôi muốn bao gồm các tệp IE6 khi tôi xây dựng cho IE6 và các tệp IE7 khi tôi xây dựng cho IE7. Cách tốt nhất để cấu trúc giải pháp của tôi cho tình huống này là gì?Làm thế nào để sử dụng các tệp khác nhau trong dự án cho các cấu hình xây dựng khác nhau - Visual Studio C# .net

Do các ràng buộc khác, tôi không muốn tạo một hội đồng riêng có chứa các mục được chia sẻ; Tôi muốn dự án biên dịch thành một assembly đơn 'foo.dll' bất kể tôi đang xây dựng cái gì.

Tôi nghĩ tôi chỉ có thể tạo hai dự án riêng biệt biên dịch thành 'foo.dll', sau đó tạo hai Cấu hình phát hành và chỉ bao gồm dự án có liên quan trong cấu hình có liên quan. Tuy nhiên tôi cần phải bao gồm các tệp giống nhau cho IE6 và IE7 trong cả hai dự án và tôi không thể xem cách sử dụng một bản sao của một tệp trong hai dự án (khi tôi thêm mục hiện có nó tạo bản sao trong thư mục dự án). Tôi đang sử dụng SVN để kiểm soát nguồn để có thể sử dụng điều đó để thực hiện 'chia sẻ' giữa các thư mục, nhưng nghi ngờ đó là cách tốt nhất ..

NB: Cần xây dựng khác nhau do sự khác biệt API trong IE, chi tiết không liên quan đến câu hỏi - chỉ cần tin tôi rằng có hai bản dựng được yêu cầu.

Trả lời

12

Trong MSBuild, bạn có thể xác định điều kiện cho các nhóm mục. Sau đó, bạn có thể ràng buộc các điều kiện đó với thiết bị đích.

Ví dụ:

<!-- Declare the condition property at the beggining of the build file --> 
<PropertyGroup Condition="$(Platform) == 'IE7'"> 
    <UseNewLibrary>true</UseNewLibrary> 
</PropertyGroup> 

<PropertyGroup Condition="$(Platform) == 'IE6'"> 
    <UseNewLibrary>false</UseNewLibrary> 
</PropertyGroup> 


<!-- Then those the property to select the right file --> 
<ItemGroup Condition="$(UseNewLibrary)==true"> 
    <Compile Include="Class1.cs"/> 
    <Compile Include="Class2.cs"/> 
    <Compile Include="Class3.cs"/> 
    <Compile Include="Class4.cs"/> 
</ItemGroup> 

<ItemGroup Condition="$(UseNewLibrary)==false"> 
    <Compile Include="Class1Old.cs"/> 
    <Compile Include="Class2Old.cs"/> 
    <Compile Include="Class3Old.cs"/> 
    <Compile Include="Class4Old.cs"/> 
</ItemGroup> 

<!-- And now references --> 
<ItemGroup Condition="$(UseNewLibrary)==true"> 
    <Reference Include="MyAssembly, Version=1.1.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
</ItemGroup> 

<ItemGroup Condition="$(UseNewLibrary)==false"> 
    <Reference Include="MyAssembly, Version=1.0.6.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
</ItemGroup> 

Lưu ý rằng tất cả các file sẽ xuất hiện trong IDE, nhưng tại thời gian biên dịch tất cả mọi thứ nên sắp xếp một cách chính xác.

Sau đó, tất cả những gì bạn cần làm là tạo nền tảng (IE6 và IE7) trong quản lý cấu hình.

Bạn cũng có thể trực tiếp sử dụng thuộc tính nền tảng thay vì tạo thuộc tính trung gian.

+0

Làm thế nào để tạo nền tảng của tôi trong quản lý cấu hình? Visual Studio 2005 không cho phép tôi thêm Nền tảng Dự án mới, nó chỉ mang lại cho tôi x86 và các tùy chọn x64 và AnyCPU – Rory

+0

Tôi có 2008 vì vậy nó có thể là một phụ đề khác nhau nhưng bạn đi vào trình quản lý cấu hình, sau đó trong tùy chọn Nền tảng thả xuống, có một tùy chọn là . – Coincoin

+0

Vâng, tôi có thể thêm Nền tảng cho Giải pháp, nhưng đối với mỗi Dự án tôi bị giới hạn trong các tùy chọn mà họ có, tôi đoán có ý nghĩa nếu nó thực sự được chuyển đến trình biên dịch với tùy chọn/nền tảng. Cấu hình thay vì – Rory

0

Tôi không chắc chắn cách thực hiện những gì bạn đang yêu cầu, nhưng bạn không thể chỉ bao gồm cả hai phiên bản trình bao bọc API trong dll và xác định phiên bản nào cần gọi khi chạy? Ví dụ: nếu người dùng cài đặt phiên bản IE6 của ứng dụng của bạn thì hãy nâng cấp lên IE7? Họ sẽ cần phải cài đặt lại, phải không?

Dường như với tôi như thế này sẽ là một giải pháp đơn giản hơn nhiều, nhưng có lẽ tôi đang thiếu một cái gì đó ...

+0

Vì tôi m hooking vào một API được cung cấp bởi IE mà là khác nhau trong các phiên bản khác nhau có những vấn đề khác nhau mà đi lên với refe xáo trộn các API, cũng như có các hội đồng interop khác nhau và vv ... Nó đơn giản hơn để biên dịch hai phiên bản với mã hơi khác một chút. – Rory

+0

Ồ, quá tệ: (Có vẻ như câu trả lời của Coincoin sẽ làm những gì bạn muốn. –

3

Để thêm cùng một tập tin trong hai hoặc nhiều dự án bạn có thể

Nhấp chuột phải vào dự án và chọn Add >> Mục
hiện Chọn tập tin trong filepicker
Nhấp vào hình tam giác nhỏ trên phía bên phải của nút Thêm trong bộ chọn tệp
Chọn Thêm làm liên kết

Điều này sẽ thêm tệp vào dự án mà không cần sao chép tệp đó.

Tôi không biết tất cả chi tiết về tình huống của bạn, nhưng bạn là giải pháp có vẻ khó xử. Hai phiên bản của cùng một dll có khả năng dẫn đến các vấn đề cấu hình trên máy tính khách. Tôi khuyến khích bạn xem xét ý tưởng của Kevin về một dll đơn với tất cả các khả năng và gọi mã thích hợp nếu cần.

2

Giả sử bạn đang sử dụng VS2005 trở lên, bạn có thể sử dụng thuộc tính Điều kiện trong tệp dự án.

Bạn sẽ cần phải chỉnh sửa các tập tin csproj trực tiếp

  1. dự án Unload
  2. Sửa

sau đó trên các tập tin bạn muốn có điều kiện bao gồm

<Compile Include="IE6.cs" Condition=" '$(Platform)' == 'IE6' " /> 
<Compile Include="IE7.cs" Condition=" '$(Platform)' == 'IE7' " /> 
<Compile Include="IE.cs" /> 
Các vấn đề liên quan