T4模板,自定义宿主,添加程序集

返回
Author Avatar
钢翼
2019-03-17
编程
183

参考微软文档:

https://docs.microsoft.com/zh-cn/visualstudio/modeling/walkthrough-creating-a-custom-text-template-host?view=vs-2017


以下方法有坑,记得躲避

        //The engine calls this method to resolve assembly references used in
        //the generated transformation class project and for the optional
        //assembly directive if the user has specified it in the text template.
        //This method can be called 0, 1, or more times.
        //---------------------------------------------------------------------
        public string ResolveAssemblyReference(string assemblyReference)        {            //If the argument is the fully qualified path of an existing file,
            //then we are done. (This does not do any work.)
            //----------------------------------------------------------------
            if (File.Exists(assemblyReference))
            {                return assemblyReference;
            }            //Maybe the assembly is in the same folder as the text template that
            //called the directive.
            //----------------------------------------------------------------
            string candidate = Path.Combine(Path.GetDirectoryName(this.TemplateFile), assemblyReference);            if (File.Exists(candidate))
            {                return candidate;
            }            //This can be customized to search specific paths for the file
            //or to search the GAC.
            //----------------------------------------------------------------
            //This can be customized to accept paths to search as command line
            //arguments.
            //----------------------------------------------------------------
            //If we cannot do better, return the original file name.
            return "";
        }

需要引用程序集时,不能直接在T4模板内直接添加以下内容 ,否则会因为路径不存在,而添加不了引用,除非你添加绝对路径。
   

<#@ assembly name="System.Data" #>
<#@ assembly name="System.Linq" #>


解决方法,应该在以下方法内直接添加系统程序集的路径。

        //The host can provide standard assembly references.
        //The engine will use these references when compiling and
        //executing the generated transformation class.
        //--------------------------------------------------------------
        public IList<string> StandardAssemblyReferences
        {            get
            {                return new string[]
                {                    //If this host searches standard paths and the GAC,
                    //we can specify the assembly name like this.
                    //---------------------------------------------------------
                    //"System"

                    //Because this host only resolves assemblies from the
                    //fully qualified path and name of the assembly,
                    //this is a quick way to get the code to give us the
                    //fully qualified path and name of the System assembly.
                    //---------------------------------------------------------
                    typeof(System.Uri).Assembly.Location
                };
            }
        }