VS2022 17.2.0 Preview 2.0:访问项目等时T4模板序列化异常

GK2*_*226 10 t4 visual-studio-2022

使用VS2022 17.2.0 Preview 2.0使用T4模板生成数据层。T4的一部分使用VS互操作/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 #>
    <#
}
#>
Run Code Online (Sandbox Code Playgroud)

这会产生以下异常:

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.
Run Code Online (Sandbox Code Playgroud)

预览版 1.0 或 VS2019 中不存在该问题。

我环顾四周并引入了 Microsoft.VisualStudio.Interop 版本 17.1.32210.191 的 nuget 包,但通过 EnvDTE.DTE(2) 访问任何内容时问题仍然存在。

我知道我太仓促了,因为它是预览版本,但是有人遇到过这个问题并解决了吗?是否需要采用不同的方法从 T4 模板访问解决方案中的项目?

调试T4模板时不会出现该错误。

aeg*_*gis 22

我玩了一下(并且谷歌了很多),发现以下内容在 VS 2022 下为我解决了这个问题:

确保您具有以下程序集和命名空间

<#@ assembly name="Microsoft.VisualStudio.Interop" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="EnvDTE80" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
Run Code Online (Sandbox Code Playgroud)

然后将 IServiceProvider 的 GetService 替换为 GetCOMService

//var dte = hostServiceProvider.GetService(typeof(DTE)) as DTE2;
var dte = hostServiceProvider.GetCOMService(typeof(DTE)) as DTE2;
Run Code Online (Sandbox Code Playgroud)

主要来自这里的答案:https ://stackoverflow.com/a/53346767/2797450