c# - $SpecificSolutionName$ 始终为空。我如何判断用户是否正在创建新的解决方案目录?

标签 c# visual-studio templates wizard

在 Visual Studio 2017 中,使用 IWizard 界面创建 C# 项目模板项目时,我向用户弹出自定义对话框,但我无法确定他们之前是否选中了“为解决方案创建目录”复选框。在生成 Project 对象之前,我仍然需要在 RunStarted() 接口(interface)函数中知道这一点(换句话说,我不能使用 project.DTE.Solution)。

Microsoft's awesome documentation说我可以只看 $SpecificSolutionName$,但它对我来说总是空的。

与此同时,other计算器 questions要么指的是多项目模板,要么就是没有答案。我的特殊问题是一个简单的单项目模板。

我也试过 $SolutionName$。在谷歌耗尽了一些令人沮丧的日子后,我放弃了,不得不捏造一些东西。如果我不必猜测预期解决方案文件夹的名称(如果有的话),那就太好了。更糟糕的是,为了确定 does-it-even-exist 解决方案文件夹是否是新的,我发现自己比较文件夹创建日期。事情开始达到临界数量的 hacky 变通办法。

问:如何在项目模板向导的 RunStarted() 中找到解决方案文件夹名称,或者至少是用户是否已选择创建新的解决方案文件夹?

最佳答案

我了解到我可以“附加到进程...”VS 的临时实例并对其进行调试。所以我必须看一下 replacementsDictionary 对象。

与所有文档所说的相反,所需的模板参数实际上是:

$SpecifiedSolutionName$

... 而不是“SpecificSolutionName”。

谜团已经解开了一半,但不要为此兴奋。 SpecifiedSolutionName 也没有按照文档所说的去做。

From https://learn.microsoft.com/en-us/visualstudio/ide/template-parameters:

When "create solution directory" is not checked, SpecificSolutionName [sic] is blank.

不。当“创建解决方案目录”未选中时,$SpecifiedSolutionName$ 包含 $projectname$ 中的任何内容。

如果不是因为解决方案目录和项目目录具有相同名称的默认行为,这对我们来说就足够了。但由于这种情况很常见,因此这个 $SpecifiedSolutionName$ 值无法告诉我们用户是否创建了新的解决方案目录。

所以我仍然看不到任何直接报告用户是勾选还是取消勾选该复选框的信息。但是,由于另一个名为 $solutiondirectory$ 的模板参数,您可以跳过一些逻辑。

也坏了。

如果用户勾选“为解决方案创建目录”,则 $solutiondirectory$ 是将保存解决方案文件的目录。如果用户取消勾选“为解决方案创建目录”,则 $solutiondirectory$ 是包含将包含解决方案文件的目录的目录,因此可能比您关心的文件系统更高。

$solutiondirectory$ 报告的实际上只是$destinationdirectory$\..\. 即,项目< 所在目录之上的目录/em> 文件。是否勾选“为解决方案创建目录”并不重要,$solutiondirectory$ 参数关心项目的文件和目录,而不是解决方案的。

那么回到问题,当解决方案和项目可能同名时,我们如何知道用户是否勾选了“为解决方案创建目录”?

在这种情况下,两个错误几乎是正确的。将 $SpecifiedSolutionName$$solutiondirectory$ 中的最终路径元素进行比较。如果这些不同,则用户肯定没有选中“为解决方案创建目录”。 (因为前者将是项目名称,而后者将是文件系统更高一点的任何内容。)

如果它们相同,则用户可能已勾选该框。但还有一件事需要考虑。也许出于某种原因,所有这些之上的目录也与项目和/或解决方案目录同名。用户可能很奇怪。我不知道解决这种情况的万无一失的方法(也许有更多同名目录),所以我只是把它留作需要注意的事情。

关于c# - $SpecificSolutionName$ 始终为空。我如何判断用户是否正在创建新的解决方案目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47217538/

相关文章:

c# - 返回 SqlConnection 或 MySqlConnection 的方法

c# - 以 DateTime 格式获取无效的月份名称

c# - 在 Release模式下的 .NET 程序集的堆栈跟踪中显示行号

c++ - 模板包扩展以将函数应用于连续的参数对

c++ - 模板语法

c# - UWP C# ListView 返回被点击行的Id值

c# - 如何从控制台应用程序返回 List<string>?

c++ - 预处理器定义在 Release模式下工作,而不是调试

visual-studio - 如何在 Visual Studio 中为局部变量和全局变量设置不同的颜色?

c# - 如何从配置文件重构高度重复的阅读部分