我使用EnvDTE我的T4模板内做一些代码生成。
我的代码在Visual Studio 2010中正常工作,但我刚刚使用Visual Studio 2012,现在当我尝试运行我的模板开始,我得到以下错误
Compiling transformation: Metadata file 'EnvDTE.dll' could not be found
我实际上并不在我的项目作为一个Silverlight类库EnvDTE参考,我不能添加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
看来,VS12可想不通的地方EnvDTE是。 它的奇怪的是,(如你在留言中提到)融合并没有挑选起来。 也许是做了,但是你没有正确地读它?
顺便说一句,当融合日志可以让你失望,它的时间打出来的Process Monitor当你想不通为什么一个应用程序无法找到的东西,应该有。
你可以给在T4模板组装一个引用完整路径。 对你来说,这将是
<#@ Assembly Name="C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies\envdte.dll" #>
(假设你在正确的位置有EnvDTE)。 我不认为这是一个真正的解决方案,并会打开一个连接问题与MS这个问题。 似乎是一个错误。
跌跌撞撞差不多的错误后,我搜索得更深一些,发现这个微软连接入口 。
为了解决这个问题只需删除.dll
从组件名称,它按预期工作:
<#@ Assembly Name="EnvDTE" #>
还要确保EnvDTE
组件在位于GAC中的C:\Windows\assembly
。 当您的计算机上安装Visual Studio这通常发生automaticaly。
例
下面是应开箱的例子:
<#@ 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() #>