2010-12-28 14 views
5

Geçmiş:T4 Metin Şablonu - Ev sahibinden derleme sembolleri almak mümkün mü?

ederim Geçenlerde Windows Phone için kütüphane taşımış olabilirsiniz vb güvensiz kod, işaretçi aritmetiği kullanılarak performans için ayarlanmış C# ile yazılmış bir açık kaynak oyun kütüphanesi var. Maalesef Windows Phone tüm güvenli kodunu desteklemez, bu yüzden çöp için bu gibi önişlemci direktifleri ile benim kaynak kodunu vardı:

#if WINDOWS || XBOX 
public unsafe struct Foo 
#elif WINDOWS_PHONE 
public struct Foo 
#endif 

nedeniyle kod temeli oldukça okunmaz ve zor hale gelmiştir bu direktiflerin miktarına korumak, bu yüzden diğer seçenekleri araştırıyordum - biri T4 kullanarak metin şablonları.

Soru:

Ne T4 rota Hava aşağı çok uzakta gitmeden önce bilmeniz gereken ya da olmasın bir metin şablonundan içinden derleme sembollerini almak mümkündür? Şablon parametrelerini inceledim ama onları dış dünyadan değiştirmek çok kolay değildi. İdeal ne görmek istiyorum biraz böyle bir şey olur: herkes Hava biraz ışık tutmak olabilir ya da değil bu mümkün

<# if (Host.CompilationSymbols.Contains("WINDOWS_PHONE") { #> 
public struct Foo 
<# { #> 

Eğer memnun olurum!

+0

Meraklı - T4 kullanarak güvenli olmayan bildirim özelliğini kaldırmayı kabul ederseniz, gerçek güvenli olmayan kodla ne yaparsınız? – tgiphil

+0

Açıkçası, şablonun işleri değiştirebileceği * tek * yer değil - diğer örnekler Foo * bar foo çubuğuna dönüşür veya bar-> foo() bar.foo() olarak değişir – MattDavey

cevap

3

Matt, Bunlar mevcut değil, projenizin derlemesi ve şablonlar derlemesi VS2010'dan itibaren tamamen izole edilmiyor.

Ancak, sizin için (biraz rahatsız edici) bir çözümüm var.

Şablon yönergenizi içeren bir stub dosyası eklerseniz, derleyici seçeneklerini derleme için uygun sembolle ayarlayabilirsiniz.

örn. Define.t4 adında aşağıdaki içeren basit saplama,:

<#@ template compilerOptions="/d:XBOX" debug="false" hostspecific="false" language="C#" #> 

bir alt dizin adında XBOX koy ve bir dizin adında TELEFON

<#@ template compilerOptions="/d:PHONE" debug="false" hostspecific="false" language="C#" #> 

Not derleyici sembol tanımları içinde benzer bir tane koyun. , En yerine şablonları şablon direktifin Şimdi mimarisini

diyelim Define.t4 dosyası içerir ve düzenli C#/VB kullanmak mümkün olacak -

Şimdi XBOX veya TELEFON ya olmaya bir ortam değişkeni ayarlamak durum sözdizimi. # Leri kendi satırlarına koymayı unutma. İşte bir örnek:

<#@ include file="$(ProjectDir)%ARCHITECTURE%\Define.t4" #> 
<#@ output extension=".txt" #> 
<# 
#if XBOX #> 
public unsafe struct Foo 
<# 
#else #> 
public struct Foo 
<# 
#endif #> 
Bu sizi hareket ettirir.

+0

Teşekkür ederim Gareth! Şablonumun içinden .csproj dosyasını ayrıştırdığım ve bir düğümü aradığım bir çözümüm vardı, ancak yolunuz daha temiz :) – MattDavey

İlgili konular