Mid*_*att 14 t4 envdte visual-studio-2012
我正在使用EnvDTE在我的T4模板中进行代码生成.
我在Visual Studio 2010中正常运行代码,但是我刚刚开始使用Visual Studio 2012,现在当我尝试运行模板时出现以下错误
Compiling transformation: Metadata file 'EnvDTE.dll' could not be found
Run Code Online (Sandbox Code Playgroud)
我实际上没有在我的项目中引用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" #>
Run Code Online (Sandbox Code Playgroud)
有什么我必须做的不同,以使其适用于Visual Studio 2012
小智 15
似乎VS12无法弄清楚EnvDTE在哪里.奇怪的是(正如你在评论中所提到的)融合没有选择那个.也许它确实如此,但你没有正确阅读它?
顺便说一下,当融合日志让你失望的时候,当你无法弄清楚为什么一个应用程序找不到应该存在的东西时,它是时候打破进程监视器了.
您可以在T4模板中为程序集引用提供完整路径.在你的情况下,它会
<#@ Assembly Name="C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies\envdte.dll" #>
(假设你在正确的位置有EnvDTE).我不认为这是一个真正的解决方案,并将与MS打开一个Connect问题.好像是一个bug.
Oli*_*ver 14
在遇到同样的错误后,我搜索了一下,找到了这个Microsoft Connect条目.
要解决此问题,只需.dll从程序集名称中删除它,它按预期工作:
<#@ Assembly Name="EnvDTE" #>
Run Code Online (Sandbox Code Playgroud)
还要确保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() #>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9221 次 |
| 最近记录: |