簡體   English   中英

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 互操作/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.

Preview 1.0 或 VS2019 中不存在此問題。

我環顧四周並為 Microsoft.VisualStudio.Interop,版本 17.1.32210.191 拉入 nuget package,但通過 EnvDTE.DTE(2) 訪問任何內容時問題仍然存在。

我知道我對此持倉促態度,因為它是預覽版,但有沒有人遇到過這個問題並解決了它? 從 T4 模板訪問解決方案中的項目是否需要不同的方法?

調試T4模板時不會出現該錯誤。

我玩了一把(還有很多谷歌),發現以下在 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;

主要來自這里的回答: https://stackoverflow.com/a/53346767/2797450

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM