VS2022 17.2.0 Preview 2.0:访问项目等时T4模板序列化异常
VS2022 17.2.0 Preview 2.0: T4 template serialization exception when accessing projects, etc
使用VS2022 17.2.0 Preview 2.0使用T4模板生成数据层。
部分T4使用VS interop / DTE访问解决方案中的项目。
以下T4为测试:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="Microsoft.VisualStudio.Shell.Interop"#>
<#@ import namespace="Microsoft.VisualStudio.Shell"#>
<#@ import namespace="Microsoft.VisualStudio.Shell.Interop"#>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="EnvDTE80" #>
<#@ output extension=".txt" #>
<#
var hostServiceProvider = Host as IServiceProvider;
var dte = hostServiceProvider.GetService(typeof(DTE)) as DTE2;
foreach (Project project in dte.Solution)
{
#><#= project.Name #>
<#
}
#>
这会产生以下异常:
Error Running transformation: System.Runtime.Serialization.SerializationException: Type 'Microsoft.VisualStudio.CommonIDE.Solutions.CMiscProject' in Assembly 'Microsoft.VisualStudio.CommonIDE, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.
预览版 1.0 或 VS2019 中不存在此问题。
我环顾四周并为 Microsoft.VisualStudio.Interop 引入了 nuget 包,版本 17.1.32210.191,但是通过 EnvDTE.DTE(2) 访问任何内容时问题仍然存在。
我知道我仓促行事,因为它是预览版,但是有人遇到过这个问题并解决了吗?从 T4 模板访问解决方案中的项目是否需要不同的方法?
调试T4模板时没有出现该错误。
我玩了一把(还有很多 Google),发现以下内容在 VS 2022 下为我解决了:
确保您拥有以下程序集和命名空间
<#@ assembly name="Microsoft.VisualStudio.Interop" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="EnvDTE80" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
然后将 IServiceProvider 的 GetService 换成 GetCOMService
//var dte = hostServiceProvider.GetService(typeof(DTE)) as DTE2;
var dte = hostServiceProvider.GetCOMService(typeof(DTE)) as DTE2;
主要来自此处的回答:
使用VS2022 17.2.0 Preview 2.0使用T4模板生成数据层。 部分T4使用VS interop / DTE访问解决方案中的项目。
以下T4为测试:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="Microsoft.VisualStudio.Shell.Interop"#>
<#@ import namespace="Microsoft.VisualStudio.Shell"#>
<#@ import namespace="Microsoft.VisualStudio.Shell.Interop"#>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="EnvDTE80" #>
<#@ output extension=".txt" #>
<#
var hostServiceProvider = Host as IServiceProvider;
var dte = hostServiceProvider.GetService(typeof(DTE)) as DTE2;
foreach (Project project in dte.Solution)
{
#><#= project.Name #>
<#
}
#>
这会产生以下异常:
Error Running transformation: System.Runtime.Serialization.SerializationException: Type 'Microsoft.VisualStudio.CommonIDE.Solutions.CMiscProject' in Assembly 'Microsoft.VisualStudio.CommonIDE, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.
预览版 1.0 或 VS2019 中不存在此问题。
我环顾四周并为 Microsoft.VisualStudio.Interop 引入了 nuget 包,版本 17.1.32210.191,但是通过 EnvDTE.DTE(2) 访问任何内容时问题仍然存在。
我知道我仓促行事,因为它是预览版,但是有人遇到过这个问题并解决了吗?从 T4 模板访问解决方案中的项目是否需要不同的方法?
调试T4模板时没有出现该错误。
我玩了一把(还有很多 Google),发现以下内容在 VS 2022 下为我解决了:
确保您拥有以下程序集和命名空间
<#@ assembly name="Microsoft.VisualStudio.Interop" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="EnvDTE80" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
然后将 IServiceProvider 的 GetService 换成 GetCOMService
//var dte = hostServiceProvider.GetService(typeof(DTE)) as DTE2;
var dte = hostServiceProvider.GetCOMService(typeof(DTE)) as DTE2;
主要来自此处的回答: