Visual Studio VS2022可扩展性:如何解决“在T4模板执行中,类型'XXX'存在于'程序集1'和'程序集2'中”

x0fgdtte  于 2023-11-21  发布在  其他
关注(0)|答案(4)|浏览(208)

我有an extension,我正在从VS2019更新到VS2022。这是一个使用建模SDK的DSL,并通过T4模板生成代码。
我已经把它转换得差不多了,但是,当运行T4时,我得到

  1. 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'
  2. 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'
  3. 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'
  4. 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'
  5. 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'
  6. 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'
  7. 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.0Microsoft.VisualStudio.Interop作为环境VS2022环境的一部分隐式可用。我不能使用Visual Studio Alias机制来消除歧义。
我读过SO上关于类似问题的其他问题,但没有一个是这个问题,他们的解决方案真的不适用。
感谢任何人的任何帮助或方向可以给给予。

vd8tlhqk

vd8tlhqk1#

今天我的T4模板也遇到了类似的问题。
我找到了添加EnvDTE程序集的文件

  1. <#@ assembly name="EnvDTE"#>

字符串
改成了

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


这解决了我的问题

wecizke3

wecizke32#

克雷格的解决方案对我不太有效。我发现这个问题在T4MVC的github上被提出,网址是https://github.com/T4MVC/T4MVC/issues/136#issuecomment-1089244574。
对我有效的建议解决方案是:
我通过删除EnvDTE、EnvDTE 80和Microsoft.VisualStudio.Shell.Interop的程序集导入修复了这个问题。(命名空间导入仍然是必需的。)
这显然与其他建议相似,但我认为它略有不同,因为这些建议似乎对我不起作用,或者我误解了它们。为了解决这个问题,我所做的就是删除三个建议的导入行。

lpwwtiir

lpwwtiir3#

尝试删除EnvDTE程序集。

  1. <#@ assembly name="EnvDTE"#>

字符串
但以下代码仍然有效:

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


我用VS2022。

6mzjoqzu

6mzjoqzu4#

如果你需要.tt文件在Visual Studio 2019和2022中工作(因为你的一些同事很固执),而不是导入,你可以使用这样的包含:
第一个月
然后在IncludeFileName.16.0.ttinclude文件中,您将拥有:
<#@ assembly name="EnvDTE"#>
IncludeFileName.17.0.ttinclude文件将是空的。

相关问题