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

问题描述 投票:0回答:4

我有 扩展 我正在从 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
文件中,也没有在我的
Dsl
DslPackage
项目中引用它们,但我从其他一些错误中了解到我必须解决
EnvDTE8.0
Microsoft.VisualStudio.Interop
作为周围 VS2022 环境的一部分隐式可用。由于它们不是我项目的一部分,因此我无法使用 Visual Studio
Alias
机制来消除歧义。

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

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

.net visual-studio t4 visual-studio-2022 dsl-tools
4个回答
21
投票

今天我的 T4 模板遇到了类似的问题。看了你的帖子并花了几分钟后,我尝试了以下

我找到了添加

EnvDTE
程序集的文件

<#@ assembly name="EnvDTE"#>

并将其更改为

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

这解决了我的问题。


3
投票

克雷格的解决方案对我来说不太有效。我发现这个问题是在T4MVC的github中提出的https://github.com/T4MVC/T4MVC/issues/136#issuecomment-1089244574

对我有用的建议解决方案是:

我通过删除 EnvDTE、EnvDTE80 和 Microsoft.VisualStudio.Shell.Interop 的程序集导入修复了此问题。 (命名空间导入仍然是必要的。)

这显然与其他建议相似,但我认为略有不同,因为这些建议似乎对我不起作用,或者我误解了它们。为了解决这个问题,我所做的就是删除三个建议的导入行。


2
投票

尝试删除 EnvDTE 程序集。

<#@ assembly name="EnvDTE"#>

但以下代码仍然有效:

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

我使用VS2022。


0
投票

如果您需要 .tt 文件同时适用于 Visual Studio 2019 和 2022(因为您的一些同事很顽固),您可以使用如下所示的包含:

<#@ include file="IncludeFileName.%VisualStudioVersion%.ttinclude" #>
然后在
IncludeFileName.16.0.ttinclude
文件中您将拥有:
<#@ assembly name="EnvDTE"#>
并且
IncludeFileName.17.0.ttinclude
文件将为空。

© www.soinside.com 2019 - 2024. All rights reserved.