VS2022 .NET 9项目集成TextTransformCore.exe失败求助
.NET 9 T4模板集成:System.Runtime加载失败解决方案
问题背景
- 开发环境:Visual Studio 2022,单解决方案
- 需求:编译.NET 9.0工具DLL,在T4模板中引用该DLL生成代码
- 故障触发:工具DLL引入
AttributeUsage、System.Reflection.FieldInfo、System.Diagnostics.ProcessStartInfo等依赖System.Runtime的类型时,出现System.Runtime加载失败错误 - 限制条件:
- 禁止修改用户目录下的程序集绑定(需保证方案可移植到纯净环境)
- 无法使用RdjNL的TextTemplatingCore扩展(不支持
T4ParameterValues传入参数加载工具DLL) - 新版TextTransformCore.exe无IDE内生成支持,手动运行时即使指定.NET 9引用路径,仍出现大量程序集加载与预定义类型未定义错误
- 降级到.NET 8.0可规避问题(因
Microsoft.VisualStudio.TextTemplating.Core依赖.NET 8),但需更优方案
可行解决方案
方案1:多目标工具项目兼容.NET 8/9
将工具项目配置为多目标编译,同时输出.NET 8和.NET 9版本的DLL,T4模板引用.NET 8版本以适配VS的T4 runtime:
- 修改工具项目的
.csproj:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net8.0;net9.0</TargetFrameworks> </PropertyGroup> </Project>
- 在T4模板中引用.NET 8版本的输出DLL:
<#@ assembly name="$(SolutionDir)MyTool\bin\$(Configuration)\net8.0\MyTool.dll" #>
- 其他业务项目可引用.NET 9版本的工具DLL,不影响功能。
优势:完全兼容IDE内T4生成,无需额外工具,可移植性强。
方案2:自定义程序集加载上下文隔离T4 runtime
在T4模板中使用AssemblyLoadContext隔离.NET 9工具DLL的加载,避免与VS自带的T4 runtime程序集冲突:
- 在T4模板中添加必要的引用:
<#@ assembly name="System.Runtime.Loader" #> <#@ import namespace="System.Runtime.Loader" #> <#@ import namespace="System.IO" #>
- 编写加载逻辑:
<# // 创建独立的加载上下文 var toolAlc = new AssemblyLoadContext("ToolAssemblyLoadContext", isCollectible: true); // 加载.NET 9工具DLL var toolPath = Path.Combine(Host.ResolvePath(".."), "MyTool", "bin", Configuration, "net9.0", "MyTool.dll"); var toolAssembly = toolAlc.LoadFromAssemblyPath(toolPath); // 通过反射调用工具类方法 var toolType = toolAssembly.GetType("MyTool.CodeGenerator"); var generateMethod = toolType.GetMethod("GenerateCode"); var result = generateMethod.Invoke(null, new object[] { T4ParameterValues["Param1"] }); #>
- 使用反射调用工具类的功能,生成代码。
优势:无需修改工具项目的目标框架,完全隔离加载上下文,避免版本冲突。
方案3:MSBuild目标替代IDE内T4生成
将T4生成流程迁移到MSBuild构建步骤,使用Microsoft.TextTemplating.MSBuild包指定.NET 9 runtime:
- 安装NuGet包:
Microsoft.TextTemplating.MSBuild - 在包含T4模板的项目的
.csproj中添加配置:
<ItemGroup> <TextTemplatingFile Include="MyTemplate.tt" /> </ItemGroup> <PropertyGroup> <!-- 指定TextTransform.exe路径 --> <TextTemplatingToolPath>$(MSBuildProgramFiles32)\Microsoft Visual Studio\2022\Community\Common7\IDE\TextTransform.exe</TextTemplatingToolPath> <!-- 指定使用.NET 9 runtime --> <TextTemplatingRuntimeVersion>net9.0</TextTemplatingRuntimeVersion> <!-- 传递T4参数 --> <TextTemplatingParameters>Param1=$(MyParamValue)</TextTemplatingParameters> </PropertyGroup>
- 执行MSBuild构建时,自动运行T4模板生成代码。
优势:脱离IDE依赖,构建流程标准化,适合CI/CD场景。
验证步骤
- 方案1:编译工具项目,确认输出包含
net8.0和net9.0目录下的DLL;在IDE内右键T4模板选择“运行自定义工具”,无加载错误,生成代码正常。 - 方案2:在T4模板中添加加载逻辑后,运行模板,检查生成的代码是否符合预期,无
System.Runtime相关报错。 - 方案3:执行
dotnet build命令,查看输出目录是否生成目标代码文件,构建日志无报错。
内容的提问来源于stack exchange,提问作者avigt
相关产品推荐
相关产品推荐

