16

我正在使用 EnvDTE 在我的 T4 模板中生成一些代码。

我的代码在 Visual Studio 2010 中正常工作,但是我刚刚开始使用 Visual Studio 2012,现在当我尝试运行我的模板时出现以下错误

Compiling transformation: Metadata file 'EnvDTE.dll' could not be found 

实际上,我的项目中没有对 EnvDTE 的引用,因为它是 Silverlight 类库,我无法添加 DLL,但是它以某种方式找到了 DLL。

我不确定 10 和 12 之间有什么区别导致这种情况。

以下是我的 ttinclude 文件开头的导入和程序集定义。

<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".generated.cs" #>
<#@ Assembly Name="EnvDTE.dll" #>
<#@ Assembly Name="System.Data" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text.RegularExpressions" #>

有什么我必须做的不同才能让它适用于 Visual Studio 2012

4

3 回答 3

17

看来 VS12 无法确定 EnvDTE 在哪里。奇怪的是(正如您在评论中提到的那样)融合并没有接受这一点。也许确实如此,但您没有正确阅读它?

顺便说一句,当融合日志让你失望时,当你无法弄清楚为什么应用程序找不到应该存在的东西时,是时候打破进程监视器了。

您可以为 T4 模板中的程序集引用提供完整路径。在你的情况下,这将是

<#@ Assembly Name="C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies\envdte.dll" #>

(假设您在正确的位置有 EnvDTE)。我不会认为这是一个真正的解决方案,并且会就此向 MS 提出 Connect 问题。似乎是一个错误。

于 2012-08-29T16:06:15.880 回答
16

在遇到同样的错误后,我进行了更深入的搜索,发现了这个 Microsoft Connect 条目

要解决此问题,只需.dll从程序集名称中删除 ,它就可以按预期工作:

<#@ Assembly Name="EnvDTE" #>

还要确保EnvDTE程序集位于 GAC 内的C:\Windows\assembly. 这通常会在您在计算机上安装 Visual Studio 时自动发生。

例子

这是一个开箱即用的示例:

<#@ template language="C#" debug="true" hostSpecific="true" #>
<#@ output extension=".txt" #>
<#@ Assembly Name="System.Core" #>
<#@ Assembly Name="System.Design" #>
<#@ Assembly Name="System.Drawing" #>
<#@ Assembly Name="System.Windows.Forms" #>
<#@ Assembly Name="EnvDTE" #>
<#@ import namespace="System" #>
<#@ import namespace="System.CodeDom.Compiler" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Drawing" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Resources" #>
<#@ import namespace="System.Resources.Tools" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="Microsoft.CSharp" #>

All projects currently available within this solution:
<#
    //System.Diagnostics.Debugger.Launch();

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

    EnvDTE.Projects projects = dte.Solution.Projects;

    foreach (EnvDTE.Project project in projects)
    {
#>
        <#= project.Name #>
<#
    }
#>

This file was generated at: <#= System.DateTime.Now.ToShortDateString() #> <#= DateTime.Now.ToLongTimeString() #>
于 2013-05-24T13:53:04.603 回答
0

在加载应用程序时,我在 Visual Studio 2019 上遇到了与 EnvDTE80 相关的问题。错误显示以下消息:“Reference.svcmap:无法加载文件或程序集“'EnvDTE”,版本=8.0.0.0,文化=中性...”

我清理了解决方案并安装了 8.0.0.0 版的 nuget 包。然后重建解决方案。通过这种方式,我的视觉工作室能够加载应用程序。

于 2020-09-03T16:10:47.650 回答