You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 修改工具项目的.csproj:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net8.0;net9.0</TargetFrameworks>
  </PropertyGroup>
</Project>
  1. 在T4模板中引用.NET 8版本的输出DLL:
<#@ assembly name="$(SolutionDir)MyTool\bin\$(Configuration)\net8.0\MyTool.dll" #>
  1. 其他业务项目可引用.NET 9版本的工具DLL,不影响功能。

优势:完全兼容IDE内T4生成,无需额外工具,可移植性强。

方案2:自定义程序集加载上下文隔离T4 runtime

在T4模板中使用AssemblyLoadContext隔离.NET 9工具DLL的加载,避免与VS自带的T4 runtime程序集冲突:

  1. 在T4模板中添加必要的引用:
<#@ assembly name="System.Runtime.Loader" #>
<#@ import namespace="System.Runtime.Loader" #>
<#@ import namespace="System.IO" #>
  1. 编写加载逻辑:
<#
// 创建独立的加载上下文
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"] });
#>
  1. 使用反射调用工具类的功能,生成代码。

优势:无需修改工具项目的目标框架,完全隔离加载上下文,避免版本冲突。

方案3:MSBuild目标替代IDE内T4生成

将T4生成流程迁移到MSBuild构建步骤,使用Microsoft.TextTemplating.MSBuild包指定.NET 9 runtime:

  1. 安装NuGet包:Microsoft.TextTemplating.MSBuild
  2. 在包含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>
  1. 执行MSBuild构建时,自动运行T4模板生成代码。

优势:脱离IDE依赖,构建流程标准化,适合CI/CD场景。

验证步骤

  • 方案1:编译工具项目,确认输出包含net8.0和net9.0目录下的DLL;在IDE内右键T4模板选择“运行自定义工具”,无加载错误,生成代码正常。
  • 方案2:在T4模板中添加加载逻辑后,运行模板,检查生成的代码是否符合预期,无System.Runtime相关报错。
  • 方案3:执行dotnet build命令,查看输出目录是否生成目标代码文件,构建日志无报错。

内容的提问来源于stack exchange,提问作者avigt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:03:22