VS2022 可扩展性:如何解决“在 T4 模板执行中,‘Assembly 1’和‘Assembly2’中都存在类型‘XXX’

Posted

技术标签:

【中文标题】VS2022 可扩展性:如何解决“在 T4 模板执行中,‘Assembly 1’和‘Assembly2’中都存在类型‘XXX’【英文标题】:VS2022 Extensibility: How to resolve "The type 'XXX' exists in both 'Assembly 1' and 'Assembly2' in T4 template execution 【发布时间】:2021-12-26 16:42:54 【问题描述】:

我有an extension 我正在从 VS2019 更新到 VS2022。它是使用建模 SDK 的 DSL,并通过 T4 模板生成代码。

我已经转换了很多,但是在运行 T4 时,我得到了

Compiling transformation: The type 'SourceControl' exists in both 'EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' and 'Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Compiling transformation: The type 'Project' exists in both 'EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' and 'Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'      
Compiling transformation: The type 'Constants' exists in both 'EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' and 'Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'    
Compiling transformation: The type 'ProjectItem' exists in both 'EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' and 'Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'  
Compiling transformation: The type 'ProjectItems' exists in both 'EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' and 'Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 
Compiling transformation: The type 'DTE' exists in both 'EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' and 'Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'          
Compiling transformation: The type 'Solution' exists in both 'EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' and 'Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'     

不知道如何解决这个问题。

我没有将这些程序集包含在我的主 .tt 文件中,也没有在我的 DslDslPackage 项目中引用它们,但我从其他一些错误中了解到我必须解决 EnvDTE8.0 和 @ 987654327@ 作为环境 VS2022 环境的一部分隐式可用。由于它们不属于我的项目,因此我无法使用 Visual Studio Alias 机制来消除歧义。

我已经阅读了关于类似问题的其他关于 SO 的问题,但没有一个是这个问题,他们的解决方案确实不适用。

感谢任何人提供的任何帮助或指导。

【问题讨论】:

【参考方案1】:

我今天在使用 T4 模板时遇到了类似的问题。在看了你的帖子并在上面胡思乱想了几分钟后,我尝试了以下方法

我找到了添加 EnvDTE 程序集的文件

<#@ assembly name="EnvDTE"#>

改成

<#@ assembly name="Microsoft.VisualStudio.Interop"#>

这解决了我的问题。

【讨论】:

这对我来说也是如此。你让我更深入地寻找,并找到包含 EnvDTE 的其他 12 个位置(并且不需要);解决这个问题并用 Microsoft.VisualStudio.Interop 代替就可以了。谢谢,克雷格! 如果您在 VS2018 中使用了 EnvDTE 和 EnvDTE80,请同时替换两者,但保留命名空间指令:&lt;#@ assembly name="EnvDTE"#&gt; &lt;#@ assembly name="EnvDTE80" #&gt; &lt;#@ import namespace="EnvDTE" #&gt;&lt;#@ assembly name="Microsoft.VisualStudio.Interop"#&gt; &lt;#@ import namespace="EnvDTE" #&gt;【参考方案2】:

尝试删除 EnvDTE 程序集。

<#@ assembly name="EnvDTE"#>

但以下代码仍然有效:

<# EnvDTE.DTE dte = (EnvDTE.DTE) ((IServiceProvider)this.Host).GetService(typeof(EnvDTE.DTE));#>

我使用的是 VS2022。

【讨论】:

以上是关于VS2022 可扩展性:如何解决“在 T4 模板执行中,‘Assembly 1’和‘Assembly2’中都存在类型‘XXX’的主要内容,如果未能解决你的问题,请参考以下文章

VS2022 C# 打包步骤

安装 VS2022 后重复 SSMS 菜单

在 VS2019 中安装 ngrok 扩展时出错

2022-03-16 解决VScode中less文件的运算式不生效的问题

vs的2022版本如何打开2019版本

VS2022 extensions - CodeMaid