添加T4模板程序集引用解决不了问题
时间:2010-11-12
来源:互联网
一、添加程序集引用解决不了问题
如果你的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模板应该按照如下的方式定义。<#@ 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{}
如果你的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中。没错,这是一种解决方案,如果被引用的程序集具有强签名的话。有一点需要注意的是,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{}
作者: menyuchun 发布时间: 2010-11-12
六、使用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.》
如果被引用的程序集所在目录是在当前解决方案或者当前项目的子目录(这是一种很常见的公共程序集保存方式),你还可以通过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.》
作者: menyuchun 发布时间: 2010-11-12
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28