VS2022 中 .Net 6.0 项目中的 T4 EF6 模板突然抛出序列化异常

5
我有一个 .Net 6.0 应用程序(最初在 VS2019 中开始为 .Net 5.0)。我使用 EF Core 进行数据访问。我们较旧的应用程序是 .Net 4.8,我们有很多 T4 模板,我们用它们基于 EDMX(EF6)生成服务类和模型类。在 .Net 6.0 应用程序中,我决定继续使用这些模板(稍作修改),因此我在解决方案中创建了一个 .Net Framework 项目,并添加了一个保存数据库信息的 EDMX。然后,在不同的项目中(服务项目或模型项目),我有读取 EDMX 并基于数据库生成代码文件的 t4 模板。
这些 T4 模板在 VS2019 中运行得非常流畅,并且我相信它们曾经在 VS2022 中运行过(不确定),但在最近进行数据库更改后,我尝试运行模板,每次都会看到以下错误:
运行转换:System.Runtime.Serialization.SerializationException: 在程序集 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 中,在 Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProjectItem 中找不到标记为可序列化的类型。
该错误指向 EF6.Utility.CS.ttinclude 文件中的这一行:
templateProjectItem = dte.Solution.FindProjectItem(_textTransformation.Host.TemplateFile);

我的T4模板在.NET Framework项目中运行良好,但是任何.NET 6.0项目中的T4模板都会出现此错误。
有几件事情需要注意:如果我调试而不是运行自定义工具,则可以运行T4模板。另外,由于引发错误的代码在EF6.Utility.CS.ttinclude中,该文件每次VS更新时都会安装Entity Framework Tools,因此我无法对该文件进行任何更改。

1
遇到了相同的问题,我相信它始于VS2022更新17.2。我的t4在17.1.x之前运行良好。自那以后,我已经成功地将https://dev59.com/wFEG5IYBdhLWcg3wK1lk#71822741中提到的解决方法应用于其他几个针对.Net 4.x的项目,但这似乎不适用于一个.Net 6项目。 - M-Peror
1
目前找到了一个解决方法。在解决方案资源管理器中,从.tt上下文菜单中使用“调试T4模板”而不是“运行自定义工具”。 - M-Peror
1
是的,我应该注意到如果我调试T4模板而不是“运行自定义工具”,我仍然可以运行它们。显然,这不是一个理想的解决方案。 - Mike S
2
同意。我已经将EF6.Utility.CS.ttinclude复制到我的项目目录中,并在那里进行了更改。这确实解决了问题 - tt文件似乎更喜欢本地ttinclude而不是来自VS的ttinclude。然而,这仍然不理想,因为它会冻结ttinclude文件,并且会错过任何随着VS更新而获得的更新或修复。但在我看来比“调试”解决方法要好。 - M-Peror
2个回答

0

我替换了以下行...

dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE));

使用

dte =  (EnvDTE.DTE) hostServiceProvider.GetCOMService(typeof(EnvDTE.DTE));

0

这个问题现在似乎已经在 VS 17.3.0 中解决了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接