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() #>