标签: t4

简单的 T4 模板在 Visual Studio 2010 中不起作用,但在 MonoDevelop 中起作用吗?

我有各种各样的地狱让 Visual Studio 2010 编译我的 T4 模板。我很确定这个相同的模板在 2008 年有效,但我现在无法确认。我确信它适用于 MonoDevelop。

无论如何,这是我模板的标题:

<#@ template language="C#v3.5" hostspecific="true" #>
<#@ output extension="cs" #>
<#@ assembly name=“System.Core” #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Linq" #>
Run Code Online (Sandbox Code Playgroud)

Visual Studio 2010 抱怨第一行,即模板指令:

以错误的格式指定了指令。将不会运行转换。请以 <#@ name [parameterName="parameterValue"]* #> 格式指定指令

为什么这不能按预期工作?

.net mono t4 visual-studio-2010

4
推荐指数
1
解决办法
707
查看次数

你如何让 T4ReferencePath 工作?

在这个问题上,我已经用头撞墙了几天。没有多少谷歌搜索或乱七八糟的东西似乎会产生答案。

我想在构建时运行 T4 模板。在其中,我需要访问我在此项目之前构建的程序集中的类型。我需要 msbuild 才能构建它,而 msbuild 不能很好地处理 VS 变量,所以我需要使用另一种方法来加载程序集。

我在很多地方都读到 T4ReferencePath 是设置加载自定义程序集的位置的答案。但是,我无法让它工作。

当我指定这个时:

<T4ReferencePath Include="$(TargetDir)" />
Run Code Online (Sandbox Code Playgroud)

当我尝试在 VS 中加载项目或使用 msbuild 运行它时,我得到了这个:

d:\Users\250894\Documents\Visual Studio 2013\Projects\TestT4\TestT4.csproj(90,22): error MSB4066: The attribute "Include" in element <T4ReferencePath> is unrecognized.
Run Code Online (Sandbox Code Playgroud)

我确实安装了“Visual Studio Visualization and Modeling SDK”。

我为不够简洁而道歉,但我包含了我的测试项目的整个 .csproj 文件,以防我遗漏了一些显而易见的东西。我不包括我的 .tt 文件,因为如果我什至无法加载我的 csproj,它就无关紧要。如果我排除 T4ReferencePath,则一切正常。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{5B9944E7-47CF-4BFE-BAEF-F02D29D59E80}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>TestT4</RootNamespace>
    <AssemblyName>TestT4</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
  </PropertyGroup> …
Run Code Online (Sandbox Code Playgroud)

.net c# msbuild t4

4
推荐指数
1
解决办法
1434
查看次数

我可以使用用户输入创建 t4 文件吗?

我正在尝试通过命令行为 cs 文件制作一个生成器。我想使用 T4,因为我真的不知道还有其他方法来生成文件并轻松移动它们。我遇到的问题是尝试将用户输入数据传递到 T4 文件。

例如,我的程序中的用户将输入他们的名字

Bob

我的 T4 模板我希望输出是

Hello Bob

我似乎无法将数据传递给它,除非我将其写入文本文件并从中读取。还有其他方法可以做到这一点吗?在某些时候,我需要它来处理属性集合,这在文本文件中正确读取可能会很痛苦。

c# asp.net t4 templates visual-studio

4
推荐指数
1
解决办法
2004
查看次数

如何以编程方式运行EntityFramework反向POCO代码优先生成器(T4)?

我想使用"EntityFramework Reverse POCO Code First Generator",但程序上不是来自VS. EntityFramework反向POCO代码Github

事实上我想从C#代码为此运行T4我为此目的下载了简单的t4引擎 Simple T4 Engine

我写了一些像这样的代码:

        Engine engine = new Engine();
        TemplatingHost host = new TemplatingHost(System.Text.Encoding.UTF32);
        host.IncludeFileSearchPaths.Add(@"D:\IncludeFiles");

        string templateFileName = "some template";
        // NOTE: Doesn't actually seem to care about the name of the template file?  True, but does use the path to search for stuff.
        host.TemplateFile = templateFileName;
        string input = File.ReadAllText(@"D:\IncludeFiles\T4Files\Database.tt");
        string output = engine.ProcessTemplate(input, host);
        File.WriteAllText(@"D:\IncludeFiles\T4Files\Output.txt", output);

        StringBuilder sb = new StringBuilder();
        foreach (CompilerError error in host.Errors)
        {
           sb.AppendLine(error.ToString());
        }

        File.WriteAllText(@"D:\IncludeFiles\T4Files\ErrorLog.txt", …
Run Code Online (Sandbox Code Playgroud)

c# t4 templates entity-framework

4
推荐指数
1
解决办法
2866
查看次数

引用 EnvDTE 的 JetBrains Rider 和 T4MVC 模板

IServiceProvider我在我的 T4MVC 模板之一中引用了 Host ( )。粗略地说,在 Studio 中运行时一切都很好,但我想知道是否有人为 Rider 解决了这个问题。

使用 Rider 执行模板时似乎不存在对EnvDTE&的引用。EnvDTE80我的猜测是他们只是利用 TextTransform 实用程序,而该实用程序似乎无法访问实现IServiceProvider

我很想解决这个问题并完全转向 Rider。任何指导将不胜感激。

t4 jetbrains-ide rider

4
推荐指数
1
解决办法
1714
查看次数

在 T4 模板中使用 .NET Core 程序集

我们当前正在将一个项目从 .NET Framework 迁移到 .NET Core 3.1,但在使某些 T4 模板正常工作时遇到问题。这些模板从我们的解决方案导入一个或多个程序集,以便使用反射生成代码。这些程序集是 .NET Core 3.1 库。问题似乎是 Visual Studio 2019 中的 T4 引擎在 Framework 上运行,无法正确加载核心程序集。

运行模板时,我得到一个ReflectionTypeLoadException. 检查异常后,很明显 T4 引擎找不到System.Runtime. 有一些解决方法(此处),但是当我应用它时,只会将问题转移到下一个依赖项,即 NuGet 包。所以解决方法不起作用。

有没有办法让 T4 模板与 .NET Core 3.1 程序集一起使用?或者是否有与 .NET Core 3.1 一起使用的 T4 模板的类似替代方案?

c# t4 visual-studio .net-core .net-core-3.1

4
推荐指数
1
解决办法
5804
查看次数

使用VolatileAssembly指令而不安装T4工具箱

我想VolatileAssembly从T4工具箱中使用但不想要求所有开发人员安装T4工具箱.

是否可以在源代码管理中包含带有项目的DLL并通过路径引用它?

t4 t4-toolbox

3
推荐指数
1
解决办法
1466
查看次数

t4"使用"关键字

我是t4的新手.

我想生成cs文件的代码.我创建了一个新的tt文件.

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>

class IOperation {

<#
OperationSection section = null;

#>
}
Run Code Online (Sandbox Code Playgroud)

OperationSection是同一程序集中的一个类.我假设我应该使用"using"关键字.

我是怎么做到的 现在我收到一个错误

错误2编译转换:找不到类型或命名空间名称'OperationSection'(您是否缺少using指令或程序集引用?)

谢谢

c# t4 c#-4.0

3
推荐指数
1
解决办法
1381
查看次数

T4嵌套模板,具有多个文件输出

我有一个模板,从数据库中读取需要生成的表和对象.没有问题,模板确实在cs文件中单独生成相关文件(很棒)我使用TemplateFileManager2.1来实现它.在这个表循环中,我想调用另一个模板,使用循环中的tablename创建该表所需的接口,并将该接口放在另一个文件中.

foreach (var table in tables)
    {  
        if(table.name !="sysdiagrams")
        {
        var manager2 = TemplateFileManager.Create(this);
            manager2.StartNewFile(table.name+"mm.cs","Generator","Deneme"); 
            InterfaceGeneratora(table.name);
            manager2.Process();
            manager2=null;


        manager.StartNewFile(table.name+".cs","Generator","GeneratedTables"); 
Run Code Online (Sandbox Code Playgroud)

这里manager对象用于输出表类,manager2用于接口.这里的poit是在调用manager2和InterfaceGeneratora(table.name)时; 运行manager2开始用新表intefarce替换创建的表接口,最后我创建了所有表类,但我手头上只有最后一个表接口.任何帮助表示赞赏.

c# t4

3
推荐指数
1
解决办法
3433
查看次数

将列表值传递给t4模板

我在这里使用代码将参数传递给模板文件.

List<string> TopicList = new List<string>();
TopicList.Add("one");
TopicList.Add("two");
TopicList.Add("three");
TopicList.Add("four");
TopicList.Add("five");
PreTextTemplate1 t = new PreTextTemplate1();
t.Session = new Microsoft.VisualStudio.TextTemplating.TextTemplatingSession();
t.Session["TimesToRepeat"] = 5;
foreach (string s in TopicList)
{
    t.Session["Name"] = s;
}
t.Initialize();
string resultText = t.TransformText();
Run Code Online (Sandbox Code Playgroud)

但每次,我得到的都是Topic列表中的最后一个值("5").

<#@ template language="C#" #>
<#@ parameter type="System.Int32" name="TimesToRepeat" #>
<#@ parameter type="System.String" name="Name" #>

<# for (int i = 0; i < TimesToRepeat; i++) { #>
Line <#= Name #>
<# } #>

Actual Output:Line five
              Line five
              Line …
Run Code Online (Sandbox Code Playgroud)

c# t4

3
推荐指数
1
解决办法
1995
查看次数