在VS2012中找不到的EnvDTE适用于VS2010

时间:2012-08-29 10:36:57

标签: t4 visual-studio-2012 envdte

我正在使用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

3 个答案:

答案 0 :(得分:15)

似乎VS12无法弄清楚EnvDTE在哪里。奇怪的是(正如你在评论中所提到的)融合没有选择那个。也许它确实如此,但你没有正确地阅读它?

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

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

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

(假设你在正确的位置有EnvDTE)。我不认为这是一个真正的解决方案,并将与MS打开一个Connect问题。看起来像一个错误。

答案 1 :(得分:14)

在遇到同样的错误后,我进行了更深入的搜索,找到了this Microsoft Connect entry

要解决此问题,只需从程序集名称中删除.dll,它就会按预期运行:

<#@ Assembly Name="EnvDTE" #>

同时确保EnvDTE程序集位于C:\Windows\assembly下的GAC中。当您在计算机上安装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() #>

答案 2 :(得分:0)

在加载应用程序时,我的Visual Studio 2019面临与EnvDTE80有关的问题。 错误显示以下消息: “ Reference.svcmap:无法加载文件或程序集”'EnvDTE,“ Version = 8.0.0.0,Culture = neutral ...”

我清洗了解决方案并安装了8.0.0.0版的nuget软件包。然后重新构建解决方案。这样,我的Visual Studio便能够加载应用程序。