我使用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来解决最初的问题。
答案 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");
}
}