2011-05-11 50 views
1

我使用VS2010 express創建了一個使用構建的遊戲。我試圖用模板(生產內容位置的強類型類,因此利用Level1Location = Content.Levels.Level1代替Level1Location = @"Content\Levels\Level1"在VS2010 Express和XNA上使用T4模板

我讀過,T4模板沒有正確設置在Express版本,但如果我創建一個擴展名的文件.TT它應該工作然而,當我在XNA類庫創建.TT文件,我得到以下警告(沒有代碼文件):

The custom tool 'TextTemplatingFileGenerator' failed. Could not load file or assembly 'Microsoft.VisualStudio.ServicesProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

我已經搜索和搜索,找不到任何有用的東西。有沒有人遇到過這個問題?任何人都知道如果解決方案?

我也嘗試改變自定義工具爲TextTemplatingFilePreprocessor建議,但我得到同樣的錯誤。

編輯:我發現問題在於它在XNA項目/庫中。它在正常的類中工作正常,所以我的解決方法是將項目添加到僅用於模板的解決方案中。這個問題仍然是開放的,你可以在XNA項目中使用它嗎?

+0

不應該是自定義工具的TextTemplatingFilePreprocessor嗎? – Marcote 2011-05-11 10:48:23

+0

當我將擴展名改爲'.tt'時,它會自動放入TextTemplatingFileGenerator。我試過TextTemplatingFilePreprocessor,但我得到了同樣的錯誤(改變了自定義工具名稱)。 – 2011-05-11 11:05:29

+0

@Markust。重新啓動VS2010似乎已經解決了這個問題,一旦我改變了自定義工具!謝謝。改變這是一個答案,我會接受。編輯:嗯,我的錯誤,我得到了同樣的錯誤,但只有一次,我嘗試'運行自定義工具' – 2011-05-11 11:51:28

回答

3

雖然我已經張貼了這個答案,我還在找(在XNA項目即TT文件自身)這樣

在任何情況下,一個簡單的方法找到這個頁面,這裏的我的工作:

創建一個新的(非XNA)類庫項目。

添加一個文本文件,用.tt擴展名重命名。

寫下你的T4代碼(見下文)。

在您的XNA項目中,添加一個現有項目,導航到創建的.cs文件並添加爲鏈接。

然後,爲了確保我們始終擁有更新後的cs文件,請右鍵單擊XNA項目並單擊項目依賴關係,然後選中包含.tt文件的類庫項目。

使用下面的模板代碼,你可以做一些事情,比如Content.Load(Content.MyGameContent.Graphics.Textures.AwesomeTexture);例如,您也可以將文件夾名稱作爲帶有Content.MyGameContent.Graphics.Textures的字符串,這要感謝一個時髦的隱式字符串轉換運算符。

<#@ template language="c#" hostspecific="true" #> 
<#@ assembly name="EnvDTE100" #> 
<#@ assembly name="EnvDTE" #> 
<#@ assembly name="System" #> 
<#@ assembly name="System.Core" #> 
<#@ import namespace="EnvDTE100" #> 
<#@ import namespace="EnvDTE" #> 
<#@ import namespace="System" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Collections.Generic" #> 
namespace Content 
{ 
<# 
var serviceProvider = this.Host as IServiceProvider; 
var dte = serviceProvider.GetService(typeof(DTE)) as DTE; 

foreach (Project Proj in dte.Solution.Projects) 
{ 
    bool IsContentProj = false; 
    foreach(Property Prop in Proj.Properties) 
    { 
     if(Prop.Name == "Microsoft.Xna.GameStudio.ContentProject.ContentRootDirectoryExtender.ContentRootDirectory") 
     { 
      IsContentProj = true; 
     } 
    } 
    if (IsContentProj) 
    { 
#> 
    public static class <#=Proj.Name #> 
    { 
<# 
     foreach(ProjectItem PI in Proj.ProjectItems) 
     { 
GenerateProjectItemClass(PI, true, "  "); 
     } 
#> 
    } 
<# 
    } 
} 
#> 
} 
<#+ 
    void GenerateProjectItemClass(ProjectItem Item, bool Static, string Indent) 
    { 
     const string FolderItemKind = "{6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}"; 
     const string FileItemKind = "{6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}"; 
     string ClassName = Path.GetDirectoryName(Item.FileNames[0]).Substring(Path.GetDirectoryName(Item.FileNames[0]).LastIndexOf(Path.DirectorySeparatorChar) + 1); 
     int ContentRootLength = Path.GetDirectoryName(Item.ContainingProject.FileName).Length; 

     string RelativeLocation = Path.ChangeExtension(Path.GetFullPath(Item.FileNames[0]).Substring(ContentRootLength + 1), null); 

     switch(Item.Kind) 
     { 
      case FolderItemKind: 
#> 
<#=Indent#>public class <#=ClassName #>Class 
<#=Indent#>{ 
<#=Indent#> private const string Location = @"<#= RelativeLocation #>"; 
<#=Indent#> public static implicit operator string(<#=ClassName #>Class MyClass) 
<#=Indent#> { 
<#=Indent#>  return Location; 
<#=Indent#> } 
<#+ 
      foreach(ProjectItem ChildItem in Item.ProjectItems) 
       GenerateProjectItemClass(ChildItem, false, Indent + " "); 
#> 
<#=Indent#>} 
<#=Indent#> 
<#=Indent#>public <#= Static ? "static " : " " #><#=ClassName#>Class <#=ClassName#> = new <#=ClassName#>Class(); 
<#=Indent#> 
<#+ 
      break; 
      case FileItemKind: 
#> 
<#=Indent#>public <#= Static ? "static " : " " #>string <#= Path.GetFileNameWithoutExtension(Item.FileNames[0]) #> = @"<#=RelativeLocation #>"; 
<#+ 
      break; 
     } 
    } 
#>