将T4模板与VS2010 Express和XNA一起使用
我正在使用VS2010Express创建一个用创建的游戏。我试图使用模板(生成内容位置的强类型类,因此使用将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
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中找到。