一起谈.NET技术,解决T4模板的程序集引用的五种方案

简介:   在众多.NET应用下的代码生成方案中,比如CodeDOM,BuildProvider, 我觉得T4是最好的一种。关于T4的基本概念和模板结果,可以参考我的文章《基于T4的代码生成方式》。如果要了解T4具体的应用,则可以参考我的文章《创建代码生成器可以很简单:如何通过T4模板生成代码?》(上篇)(下篇)。

  在众多.NET应用下的代码生成方案中,比如CodeDOMBuildProvider, 我觉得T4是最好的一种。关于T4的基本概念和模板结果,可以参考我的文章《基于T4的代码生成方式》。如果要了解T4具体的应用,则可以参考我的文章《创建代码生成器可以很简单:如何通过T4模板生成代码?》(上篇)(下篇)。如果你编写T4模板,你不得不面对一个问题——如何引用一个程序集?VS 2010采用了与VS2008不同的程序集引用的解析机制。本篇文章为你介绍在VS2010下5种不同的程序集引用的方式。

目录
一、添加程序集引用解决不了问题
二、将引用程序集安装到GAC
三、利用VS的PublicAssemblies目录
四、指定程序集的具体路径
五、采用环境变量
六、使用VS宏

  一、添加程序集引用解决不了问题

  如果你的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模板,会出现如下的编译错误。

image  二、将引用程序集安装到GAC

  其实我们有很多方式来解决这个问题,你首先想到的肯定是将引用的程序集安装到GAC中。没错,这是一种解决方案,如果被引用的程序集具有强签名的话。有一点需要注意的是,T4模板引用某个安装于GAC的程序集的时候,在<#@ assembly…#>指令下不能指定文件扩展名(.dll)。T4模板应该按照如下的方式定义。

 
 
< #@ template debug = " false " hostspecific = " false " language = " C# " # >
< #@ assembly name = " Artech.T4AssemblyRefResovle.Foo " # >
< #@ output extension = " .cs " # >
public class HelloWorld
{}

  三、利用VS的PublicAssemblies目录

  为了让T4引擎能够找到引用的程序集,你可以将其拷贝到VS 2010的PublicAssemblies目的下,该目录为C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies。如果将Artech.T4AssemblyRefResovle.Foo.dll拷贝到该目录下,你在T4模板的<#@ assembly…#>指令下就可以直接指定程序集名称(不包括扩展名)或者程序集文件名(包括扩展名)。

 
 
< #@ template debug = " false " hostspecific = " false " language = " C# " # >
< #@ assembly name = " Artech.T4AssemblyRefResovle.Foo " # >
< #@ output extension = " .cs " # >
public class HelloWorld
{}

  指定文件扩展名:

 
 
< #@ template debug = " false " hostspecific = " false " language = " C# " # >
< #@ assembly name = " Artech.T4AssemblyRefResovle.Foo.dll " # >
< #@ output extension = " .cs " # >
public class HelloWorld
{}
   四、指定程序集的具体路径

  如果被引用的程序集被没有被签名,GAC的方式则不能使用,在这种情况下你需要指定程序集文件所在的位置,最直接的当然就是指定程序集文件的绝对路径。在下面的T4模板中,<#@ assembly…#>指令中指定的就是Artech.T4AssemblyRefResovle.Foo.dll文件的绝对路径。

 
 
< #@ template debug = " false " hostspecific = " false " language = " C# " # >
< #@ assembly name = " D:\T4AssemblyRefResovle\Lib\Artech.T4AssemblyRefResovle.Foo.dll " # >
< #@ output extension = " .cs " # >
public class HelloWorld
{}

  五、采用环境变量

  采用程序集文件的绝对路径这种硬编码并不是一种推荐的解决方案,因为在团队开发中,每个开发人员用于存放同一个程序集的地址可能不同,在这种情况下你可以采用环境变量的方式。你可以定义个环境变量(比如FooDir)表示本机用于保存程序集的目录(比如D:\T4AssemblyRefResovle\Lib),那么被引用的程序集就可以表示成:%FooDir%\Artech.T4AssemblyRefResovle.Foo.dll.

 
 
< #@ template debug = " false " hostspecific = " false " language = " C# " # >
< #@ assembly name = " %FooDir%\Artech.T4AssemblyRefResovle.Foo.dll " # >
< #@ output extension = " .cs " # >
public class HelloWorld
{}

  六、使用VS宏

  如果被引用的程序集所在目录是在当前解决方案或者当前项目的子目录(这是一种很常见的公共程序集保存方式),你还可以通过VS的宏命令来指定该目录。比如我们的Artech.T4AssemblyRefResovle.Foo.dll保存在当前解决方案目录的Lib子目录下,该程序集的路径就可以表示成:$(SolutionDir)\Lib\Artech.T4AssemblyRefResovle.Foo.dll。

 
 
< #@ template debug = " false " hostspecific = " false " language = " C# " # >
< #@ assembly name = " $(SolutionDir)\Lib\Artech.T4AssemblyRefResovle.Foo.dll " # >
< #@ output extension = " .cs " # >
public class HelloWorld
{}

  注:上面提到的程序集引用解决方案来源于《T4 Template error - Assembly Directive cannot locate referenced assembly in Visual Studio 2010 project.》

目录
相关文章
|
9天前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
21 3
|
9天前
|
开发框架 安全 Java
.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力
本文深入探讨了.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力。.NET不仅支持跨平台开发,具备出色的安全性和稳定性,还能与多种技术无缝集成,为企业级应用提供全面支持。
18 3
|
12天前
|
人工智能 开发框架 前端开发
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
|
11天前
|
人工智能 开发框架 安全
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
|
1月前
|
人工智能 开发框架 Cloud Native
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
43 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
63 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
49 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
129 0
下一篇
无影云桌面