打字机相对目录

时间:2017-04-03 21:36:49

标签: visual-studio visual-studio-2017 typewriter

我使用Visual Studio和Visual Studio 2017的Typewriter扩展名。以下是Typescript模板文件。

${
    using System.IO;

    Template(Settings settings)
    {
        settings.IncludeProject("ProjectName");
    }

    string Test(Class c)
    {
        //return Path.GetDirectoryName(Path.GetDirectoryName( System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase ))); // > file:\C:\Users\[user]\AppData\Local
        //return Environment.CurrentDirectory; // > C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE
        return String.Join(", ", Directory.GetFiles("relative\path")); // > System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\relative\path'.
    }

}
$Classes(ProjectName.Models.*)[
export class $Name {
    $Properties[
    public $Name: $Type;]
    // $Test
}]

使用Directory.GetFiles时,路径相对于C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE而不是相对于模板文件或项目。我怎样才能获得相关文件?

P.S。不确定这是否特定于打字机或Visual Studio Extensions。

修改
我已经尝试了DTE

using EnvDTE;
DTE dte = (DTE)GetService(typeof(DTE));
string solutionDir = System.IO.Path.GetDirectoryName(dte.Solution.FullName);

但是我得到了The type or namespace name 'EnvDTE' could not be found (are you missing a using directive or an assembly reference?)而我没有在现有扩展程序中引用程序集。如果我可以使用DTE来解决最初的问题。

2 个答案:

答案 0 :(得分:0)

该类的$ Parent属性是$ File,它具有$ FullName属性,这是绝对文件名。我正在使用它来获取接口的文件名:

string FileName(Interface @interface)
{
   return (@interface.Parent as File).FullName;
}

也许您可以从那里找出模板文件的路径?

答案 1 :(得分:0)

由于上面的评论,我能够通过以下方式实现这一目标:

#reference EnvDTE 
#reference Microsoft.VisualStudio.Shell.15.0

${    
    Template(Settings settings)
    {
        EnvDTE.DTE dte = (EnvDTE.DTE)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(EnvDTE.DTE));
        var fileName = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(dte.Solution.FullName), "myfile.txt");
    }

}