2010-12-28 14 views
5

पृष्ठभूमि:टी 4 टेक्स्ट टेम्पलेट - क्या होस्ट से संकलन प्रतीक प्राप्त करना संभव है?

मैं एक खुला स्रोत खेल सी # में लिखा पुस्तकालय जो अत्यधिक प्रदर्शन के लिए समायोजित किया गया है, मैं हाल ही में विंडोज फोन के लिए पुस्तकालय पोर्ट किया है असुरक्षित कोड, सूचक अंकगणित आदि का उपयोग कर सकते है। दुर्भाग्य से विंडोज फोन पर सभी असुरक्षित कोड का समर्थन नहीं करता, तो मैं कूड़े को इस जैसे पूर्वप्रक्रमक निर्देशों के साथ अपने स्रोत कोड पड़ा है: इन निर्देशों codebase काफी अपठनीय और करने के लिए मुश्किल हो गया है की राशि के कारण

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

बनाए रखें, इसलिए मैं अन्य विकल्पों की खोज कर रहा हूं - जिनमें से एक टी 4 का उपयोग कर टेक्स्ट टेम्पलेट्स है।

प्रश्न:

क्या मैं बहुत दूर जा रहा नीचे टी -4 मार्ग मौसम से पहले पता करने की जरूरत है या नहीं यह एक पाठ टेम्पलेट के भीतर से संकलन प्रतीकों पाने के लिए संभव है? मैंने टेम्पलेट पैरामीटर में देखा है लेकिन बाहरी दुनिया से उन्हें संशोधित करना बहुत आसान प्रतीत नहीं होता है। आदर्श रूप में मैं क्या देखना चाहते हैं कुछ है इस तरह एक सा: किसी को भी मौसम पर कुछ प्रकाश डाला सकता है या नहीं यह संभव है

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

अगर मैं आभारी होगी!

+0

उत्सुक - मानते हुए कि आप टी 4 का उपयोग करके असुरक्षित घोषणा विशेषता को हटाते हैं, तो आप वास्तविक असुरक्षित कोड के साथ क्या करते हैं? – tgiphil

+0

स्पष्ट रूप से यह * केवल * जगह नहीं है जहां टेम्पलेट चीजों को बदल देगा - अन्य उदाहरण फू बार बार में बार/बार परिवर्तन होंगे, या बार-> foo() bar.foo() – MattDavey

उत्तर

3

मैट, वे उपलब्ध नहीं हैं, आपकी परियोजना के संकलन के रूप में नहीं और टेम्पलेट्स के संकलन को पूरी तरह से VS2010 के रूप में अलग कर दिया गया है।

हालांकि मेरे पास आपके लिए कुछ (कुछ हद तक बेकार) कामकाज है।

यदि आप एक स्टब फ़ाइल शामिल करते हैं जिसमें आपका टेम्पलेट निर्देश होता है, तो आप संकलन के लिए उपयुक्त प्रतीक के साथ कंपाइलर विकल्प सेट कर सकते हैं।

उदा। एक सरल ठूंठ निम्नलिखित युक्त, Define.t4 नामित:

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

नाम वाली उप XBOX में इस रखो और एक नामी निर्देशिका फोन

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

नोट संकलक प्रतीक परिभाषा में इसी तरह की एक डाल दिया।

अब एक वातावरण चर सेट या तो XBOX या फोन होने के लिए - की वास्तुकला का कहना है

अब आप अपने टेम्पलेट्स में टेम्पलेट के निर्देश के बजाय करते हैं, Define.t4 फ़ाइल को शामिल और आप नियमित रूप से सी #/वीबी उपयोग करने के लिए सक्षम हो जाएगा हालत वाक्यविन्यास। #if को अपनी लाइन पर रखना न भूलें। यहां एक उदाहरण दिया गया है:

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

आशा है कि यह आपको आगे बढ़ेगा।

+0

में परिवर्तन गैरेथ धन्यवाद! मेरे पास एक वर्कअराउंड था जहां मैं अपने टेम्पलेट के भीतर से .csproj फ़ाइल को पार्स कर रहा था और नोड ढूंढ रहा था, लेकिन आपका तरीका बहुत साफ है :) – MattDavey

संबंधित मुद्दे