将T4模板与VS2010 Express和XNA一起使用

将T4模板与VS2010 Express和XNA一起使用,xna,t4,c#,visual-studio-express,Xna,T4,C#,Visual Studio Express,我正在使用VS2010Express创建一个用创建的游戏。我试图使用模板(生成内容位置的强类型类,因此使用Level1Location=content.Levels.Level1而不是Level1Location=@“content\Levels\Level1”) 我已经了解到,在express Edition中没有正确设置T4模板,但是如果我创建一个扩展名为.tt的文件,它应该可以工作。但是,当我在XNA类库中创建一个.tt文件时,我得到以下警告(并且没有代码文件): 自定义工具“TextTe

我正在使用VS2010Express创建一个用创建的游戏。我试图使用模板(生成内容位置的强类型类,因此使用
Level1Location=content.Levels.Level1
而不是
Level1Location=@“content\Levels\Level1”

我已经了解到,在express Edition中没有正确设置T4模板,但是如果我创建一个扩展名为.tt的文件,它应该可以工作。但是,当我在XNA类库中创建一个.tt文件时,我得到以下警告(并且没有代码文件):

自定义工具“TextTemplatingFileGenerator”失败。无法加载文件或程序集“Microsoft.VisualStudio.ServicesProxy,版本=10.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。系统找不到指定的文件。

我搜索了又搜索,找不到任何有用的东西。以前有人遇到过这个问题吗?有人知道解决方案吗

我还尝试按照建议将自定义工具更改为
TextTemplatingFilePreprocessor
,但是我得到了相同的错误


编辑:我发现问题在于它在XNA项目/库中。它在普通类中运行良好,因此我的解决方法是仅为模板向解决方案中添加一个项目。但问题仍然悬而未决,你能让它在XNA项目中运行吗?虽然我发布了这个答案,但我仍然很失望king提供了一种更简单的方法(即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;
        }
    }
#>

命名空间内容
{
公共静态类
{
}
}
公共课
{
私有常量字符串位置=@“”;
公共静态隐式运算符字符串(类MyClass)
{
返回位置;
}
}
公共类=新类();
公共字符串=@“”;

不应该是自定义工具的TextTemplatingFilePreprocessor?当我将扩展名更改为
.tt
时,它会自动放入TextTemplatingFileGenerator。我尝试了TextTemplatingFilePreprocessor,但我得到了相同的错误(自定义工具名称更改)@Markust.一旦我更改了自定义工具,重新启动VS2010似乎已经解决了这个问题!谢谢。将此更改为答案,我将接受。编辑:嗯,我的错误我得到了相同的错误,但只有当我尝试“运行自定义工具”时,你才尝试通过添加->新建项->文本模板来添加模板,而不是手动重命名为.tt?该选项不是av可在VS2010 express中找到。