SORU
27 Mayıs 2010, PERŞEMBE


Derleme ve Çerçeve koşullu Hedefler

Benim proje için kod eğer hedef çerçeve daha yeni bir sürüm olsaydı büyük ölçüde gelişmiş olabilir birkaç küçük yer var. Daha iyi kaldıraç C koşullu derleme için güçlü olmak istiyorum# gerektiğinde bu geçiş yapmak için.

Gibi bir şey

#if NET40
using FooXX = Foo40;
#elif NET35
using FooXX = Foo35;
#else NET20
using FooXX = Foo20;
#endif

Bu sembollerden herhangi birini bedavaya geliyor? Proje yapılandırma bir parçası olarak bu semboller enjekte gerek var mı? Kolay MSBuild hedef olan bilemeyeceğim beri yapmak için yeterli görünüyor.

/p:DefineConstants="NET40"

Güncelleme:Benim sorum insanlar bu sorunla başa çıkma nasıl olur? Farklı konfigürasyonları oluşturmak mı? Komutu ile sabitler hattı geçiyor mu?

CEVAP
28 Mayıs 2010, Cuma


Bu farklı oluşturmak için yapmak için en iyi yollarından biri projenizde: yapılandırmaları oluşturmak

<PropertyGroup Condition="  '$(Framework)' == 'NET20' ">
  <DefineConstants>NET20</DefineConstants>
  <OutputPath>bin\$(Configuration)\$(Framework)</OutputPath>
</PropertyGroup>


<PropertyGroup Condition="  '$(Framework)' == 'NET35' ">
  <DefineConstants>NET35</DefineConstants>
  <OutputPath>bin\$(Configuration)\$(Framework)</OutputPath>
</PropertyGroup>

Ve varsayılan yapılandırmaları biri

<Framework Condition=" '$(Framework)' == '' ">NET35</Framework>

Eğer başka bir yerde tanımlı değilse varsayılan olarak ayarlayın. Yukarıdaki durumda OutputPath her sürümü kurmak ayrı bir Kurul, her zaman verecektir.

Sonra farklı sürümlerini derlemek için AfterBuild bir hedef oluşturmak:

<Target Name="AfterBuild">
  <MSBuild Condition=" '$(Framework)' != 'NET20'"
    Projects="$(MSBuildProjectFile)"
    Properties="Framework=NET20"
    RunEachTargetSeparately="true"  />
</Target>

Bu örnek Çerçeve değişken ilk inşa (hem derleme ve ilk inşa yukarıdan varsayılan NET35 olduğunu varsayarak) sonra NET20 set ile tüm projeyi yeniden derleyin. Her koşullu derleme tanımlamak değerleri doğru ayarlanmış olacak.

Bu şekilde bile, G/Ç #ifdef dosyaları sahip olmak istiyorsanız proje dosyasında bazı dosyaları hariç tutabilirsiniz:

<Compile Include="SomeNet20SpecificClass.cs" Condition=" '$(Framework)' == 'NET20' " />

hatta başvuruyor

<Reference Include="Some.Assembly" Condition="" '$(Framework)' == 'NET20' " >
  <HintPath>..\Lib\$(Framework)\Some.Assembly.dll</HintPath>
</Reference>

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CNET

    CNET

    5 Mayıs 2006
  • DorkmanScott

    DorkmanScott

    14 NİSAN 2006
  • Michael Lummio

    Michael Lumm

    25 Mayıs 2007