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

时间:2017-11-10 07:16:47

标签: c# visual-studio templates wizard

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

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

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

我也试过$ SolutionName $。经过一段令人沮丧的谷歌疲惫的日子,我放弃了,不得不捏造东西。如果我没有对预期的解决方案文件夹的名称进行猜测(如果有的话),那将是很好的。更糟糕的是,为了确定是否存在 - 甚至存在解决方案文件夹是否是新的,我发现自己正在比较文件夹创建日期。事情已经开始达到一定数量的hacky变通办法。

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

3 个答案:

答案 0 :(得分:1)

我了解到我只能“附加到进程...”VS的临时实例并进行调试。所以我得看一下replamentsDictionary对象。

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

<强> $ $ SpecifiedSolutionName

...而不是“SpecificSolutionName”。

这是解决了一半的谜团,但不要让这让你兴奋。 SpecifiedSolutionName 也不会执行文档所说的内容。

  

从   https://docs.microsoft.com/en-us/visualstudio/ide/template-parameters

     

未选中“创建解决方案目录”时,SpecificSolutionName [sic]   是空白的。

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

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

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

哪个也坏了。

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

$ solutiondirectory $ 报告实际上只是 $ destinationdirectory $ \ .. \。即,将保存项目的目录上方的目录< / em>文件。如果勾选“创建解决方案目录”无关紧要, $ solutiondirectory $ 参数会关注项目的文件&amp;目录,而不是解决方案。

回到这个问题,当解决方案和项目可能都具有相同的名称时,我们如何知道用户是否勾选了“为解决方案创建目录”?

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

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

答案 1 :(得分:1)

这是在VS2019中起作用的东西:

当用户选中“ 将解决方案和项目放在同一目录”复选框时, $ specifiedsolutionname $ 为空,而 $ solutiondirectory $ >包含到根文件夹的路径,与新解决方案相关的所有内容均放置在该根文件夹中。取消选中时, $ specifiedsolutionname $ 包含用户指定的“ 解决方案名称”(这是在解决方案根文件夹下创建的子文件夹的名称,以及项目所在的位置(s)放置),并且 $ destinationdirectory $ 包含解决方案根文件夹的正确路径。

HTH

答案 2 :(得分:0)

最后,对于一个多项目解决方案,这就是让我工作的原因: -

解决方案级别(多项目)模板: -

<TemplateContent>
    <ProjectCollection>
        <ProjectTemplateLink ProjectName="$safeprojectname$.WebApp">
            WebApp\MyTemplate.vstemplate
        </ProjectTemplateLink>   .....

代码级别更改

namespace $safeprojectname$

由于第1步,项目名称现在包含解决方案名称。在项目级别,命名空间和程序集名称应该是理想的,不需要在那里分开。

如果有帮助,请告诉我