【问题标题】:T4 Get Current Working Directory of SolutionT4 获取解决方案的当前工作目录
【发布时间】:2011-06-24 13:56:55
【问题描述】:

我在 Visual Studio 2010 中使用 T4,我想迭代解决方案中的文件,但是我发现 T4 源代码生成在一种沙盒中工作,当前工作目录位于 Visual Studio 中程序文件中的 Studio 10 目录。

有没有办法以相对论的方式引用 T4 文件所在的解决方案,这样它就不会破坏构建,或者在其他没有相同文件结构的盒子上工作等?

谢谢

【问题讨论】:

    标签: c# visual-studio code-generation t4


    【解决方案1】:

    您必须像这样将hostspecific 属性设置为true:

    <#@ template language="C#" hostspecific="True" #>
    

    ITextTemplatingEngineHost 界面将为您提供所需的信息。

    <#= this.Host.ResolveParameterValue("-", "-", "projects") #>
    

    我不相信有办法引用该解决方案,但您可以获取您的 *.tt 文件所在的路径,并从那里获取其他文件。

    要从相对于文本模板的位置加载文件,您可以使用:

    this.Host.ResolvePath("relative/path.txt")
    

    【讨论】:

    • 谢谢希夫!我最终使用了 this.Host.TemplateFile,它直接指向模板并从那里运行。
    • 您可以通过加载DTE直接获得解决方案:stackoverflow.com/questions/12952110/…
    • @PhilipPittle 为什么我更喜欢这个?
    • @devi - 我不关注,你指的是什么偏好? Shiv 说“我不相信有办法引用解决方案”,我评论说“您可以通过加载 DTE 直接获取解决方案”。
    【解决方案2】:

    这是我获取解决方案基目录的方法:

    public string GetSolutionDirectory()
    {
        var serviceProvider = this.Host as IServiceProvider;
        var dte = serviceProvider.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
        return System.IO.Path.GetDirectoryName(dte.Solution.FullName);
    }
    

    【讨论】:

    • 我错过了尝试您的方法的一个信息是使用 如 Brandon S. 的回答所示。遗憾的是,大多数人在发布代码示例时忘记提及导入/程序集定义。除此之外,我发现您的答案正是我所需要的。谢谢!
    【解决方案3】:

    下面是如何使用创建 XML 文件的 T4 模板中提供的逻辑 JCallico:

    <#@ template debug="false" hostspecific="true" language="C#" #><# /* hostspecific must be set to "true" in order to access Visual Studio project properties. */ #>
    <#@ assembly name="System.Core" #>
    <#@ import namespace="System.Text" #>
    <#@ output extension=".xml" #>
    <#@ assembly name="EnvDTE" #><# /* This assembly provides access to Visual Studio project properties. */ #>
    <#
        var serviceProvider = this.Host as IServiceProvider;
        var dte = serviceProvider.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
        var solutionDirectory = System.IO.Path.GetDirectoryName(dte.Solution.FullName);
    #>
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <mySetting filePath="<#= solutionDirectory #>\MySubfolder\MyFile.exe" />
    </configuration>
    

    XML 属性“filePath”将等于 Visual Studio 的解决方案目录加上“\MySubfolder\MyFile.exe”。

    【讨论】:

    • 创建 XML 文件与原始问题有什么关系?看来您复制/粘贴另一个答案并在与该问题没有任何关系的解决方案中实施它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多