EnvDTE не найден в VS2012 работает в VS2010

Я использую 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

Ответы

Ответ 1

Похоже, VS12 не может определить, где находится EnvDTE. Его странное, что (как вы упоминали в комментарии), слияние не подходило. Возможно, это так, но вы не читали его правильно?

В стороне, когда журнал фьюжн позволяет вам опуститься, пришло время разбить Process Monitor, когда вы не можете понять, почему приложение не может найти что-то, что должно быть там.

Вы можете указать полный путь для ссылок на сборки в шаблонах T4. В вашем случае это будет

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

(если у вас есть EnvDTE в правильном месте). Я бы не счел это истинным решением и открыл об этом проблему Connect с MS. Похоже на ошибку.

Ответ 2

После спотыкания о той же ошибке я искал немного глубже и нашел эту запись 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() #>