2010-12-28 4 views
5

背景:T4テキストテンプレート - ホストからコンパイルシンボルを取得できますか?

は、私は非常に私は最近、Windowsの携帯電話にライブラリを移植してきたなど、安全でないコード、ポインタ演算を使用して、パフォーマンスのために調整されたC#で書かれたオープンソースのゲームライブラリを持っています。残念ながら、Windowsの携帯電話は、すべての危険なコードをサポートしていないので、私はトイレにこのようなプリプロセッサディレクティブと私のソースコードを持っていた:

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

ためのコードベースはかなり読めないとすることは困難になってきたこれらのディレクティブの量を私は他のオプションを探求してきました。そのうちの1つは、T4を使ったテキストテンプレートです。

質問:テキストテンプレート内からコンパイルシンボルを取得することが可能になる天気をか

私はT4ルートダウンあまりにも遠くに行く前に知っておく必要がある何がありますか?私はテンプレートのパラメータを調べましたが、外部から変更するのは非常に簡単ではありませんでした。これが可能である天気を上かどうか、誰もがいくつかの光を当てることができれば、私は感謝されると思います

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

:理想的には私が見たいものをビット、このようなものです!

+0

好奇心 - T4を使用して安全でない宣言属性を削除すると仮定すると、実際の安全でないコードはどうなりますか? – tgiphil

+0

明らかに、テンプレートが物事を変える場所だけではありません - 他の例はref Foo barへのFoo * barの変更、bar-> foo()へのbar.foo()の変更 – MattDavey

答えて

3

Matt、 プロジェクト用のコンパイルでは使用できません。テンプレート用のコンパイルは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またはPHONEのいずれかに環境変数を設定 - 、のではなく、あなたのテンプレートでテンプレートディレクティブのアーキテクチャは今

を言わせDefine.t4ファイルを含めると、あなたは、通常のCの#/ VBを使用することができます条件構文。 #ifを自分の行に置くことを忘れないでください。ここに例があります:

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

これはあなたが動くことを望みます。

+0

Garethありがとうございます!私は私のテンプレート内から.csprojファイルを解析し、ノードを探していましたが、あなたの方法ははるかにクリーンです。 – MattDavey

関連する問題