解决T4模板的程序集引用的五种方案
在众多.NET应用下的代码生成方案中,比如CodeDOM,BuildProvider,我觉得T4是最好的一种。关于T4的基本概念和模板结果,可以参考我的文章《基于T4的代码生成方式》。如果要了解T4具体的应用,则可以参考我的文章《创建代码生成器可以很简单:如何通过T4模板生成代码?》(上篇)(下篇)。如果你编写T4模板,你不得不面对一个问题——如何引用一个程序集?VS 2010采用了与VS2008不同的程序集引用的解析机制。本篇文章为你介绍在VS2010下5种不同的程序集引用的方式。
一、添加程序集引用解决不了问题 如果你的T4模板需要调用一个自定义的类型,并且该类型定义在某个非系统程序集中,你就需要通过T4<#@ assembly…#>指令引用该程序集。在VS 2008环境下,你只需要为当前项目添加相应的程序集引用,并且通过<@ assembly…#>指令的name属性指定程序集(Dll)的文件名即可。比如,下面的T4模板包含了对程序集Artech.T4AssemblyRefResovle.Foo.dll的引用。 <#@ template debug="false" hostspecific="false" language="C#" #> <#@ assembly name="Artech.T4AssemblyRefResovle.Foo.dll" #>
<#@ output extension=".cs" #>
public class HelloWorld {} 但是这种方式对于VS 2010则行不通,因为T4引擎在解析和编译模板的时候并不会从项目引用列表中去定位目标程序集。所以,对于上面的T4模板,会出现如下的编译错误。 二、将引用程序集安装到GAC其实我们有很多方式来解决这个问题,你首先想到的肯定是将引用的程序集安装到GAC中。没错,这是一种解决方案,如果被引用的程序集具有强签名的话。有一点需要注意的是,T4模板引用某个安装于GAC的程序集的时候,在<#@ assembly…#>指令下不能指定文件扩展名(.dll)。T4模板应该按照如下的方式定义。 {} ?三、利用VS的PublicAssemblies目录为了让T4引擎能够找到引用的程序集,你可以将其拷贝到VS 2010的PublicAssemblies目的下,该目录为C:Program Files (x86)Microsoft Visual Studio 10.0Common7IDEPublicAssemblies。如果将Artech.T4AssemblyRefResovle.Foo.dll拷贝到该目录下,你在T4模板的<#@ assembly…#>指令下就可以直接指定程序集名称(不包括扩展名)或者程序集文件名(包括扩展名)。 {}
指定文件扩展名 {}
?四、指定程序集的具体路径如果被引用的程序集被没有被签名,GAC的方式则不能使用,在这种情况下你需要指定程序集文件所在的位置,最直接的当然就是指定程序集文件的绝对路径。在下面的T4模板中,<#@ assembly…#>指令中指定的就是Artech.T4AssemblyRefResovle.Foo.dll文件的绝对路径。 {}
?五、采用环境变量采用程序集文件的绝对路径这种硬编码并不是一种推荐的解决方案,因为在团队开发中,每个开发人员用于存放同一个程序集的地址可能不同,在这种情况下你可以采用环境变量的方式。你可以定义个环境变量(比如FooDir)表示本机用于保存程序集的目录(比如D:T4AssemblyRefResovleLib),那么被引用的程序集就可以表示成:%FooDir%Artech.T4AssemblyRefResovle.Foo.dll. {}
?六、使用VS宏如果被引用的程序集所在目录是在当前解决方案或者当前项目的子目录(这是一种很常见的公共程序集保存方式),你还可以通过VS的宏命令来指定该目录。比如我们的Artech.T4AssemblyRefResovle.Foo.dll保存在当前解决方案目录的Lib子目录下,该程序集的路径就可以表示成:$(SolutionDir)LibArtech.T4AssemblyRefResovle.Foo.dll。 {}
注:上面提到的程序集引用解决方案来源于《T4 Template error - Assembly Directive cannot locate referenced assembly in Visual Studio 2010 project.》 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – MVC反伪造令牌如何在Web服务器重启之间存活
- asp.net-mvc – 在活动的SignalR连接期间更改用户身份 – 如
- ASP.NET开发人员试图学习Drupal和PHP
- asp.net – 内容处理:内联在Chrome中不起作用?
- asp.net-mvc-3 – 如何使用DropdownList助手正确创建MultiS
- asp.net – 最有效的方式…独特的随机字符串
- asp.net – GridView分页 – 第一,最后,下一个,上一个
- asp.net-core – ASP.NET 5中RegisterObject / QueueBackgr
- asp.net – 如何从System.Web.HttpPostedFileBase转换为Sys
- asp.net – 为什么不能通过IIS7中的web.config删除“服务器
- asp.net-mvc – ASP.net MVC自定义路由处理程序/
- asp.net-mvc – 我的ASP.NET MVC应用程序是否正确
- .NET Core的文件系统[3]:由PhysicalFileProvide
- Asp.net mvc验证用户登录之Forms实现详解
- asp.net-mvc-5 – 在web api 2 web服务中处理方法
- asp.net – Session实际上如何在MVC中运行?
- asp.net – 在遇到性能问题之前,一个azure实例上
- asp.net – IIS Express似乎不会挑选对applicati
- asp.net-mvc – EnumDataType属性在ASP.NET MVC中
- asp.net-mvc – 跟踪广告系列,来自gmail的奇怪行