Visual Studio项目模板:替换为项目名称

时间:2014-11-09 19:16:22

标签: c# visual-studio templates

我尝试在Visual Studio 2013中为EF Code-First上下文类创建项模板。除了我想要一个指向当前项目中的命名空间的using语句之外,我已经完成了所有工作。例如,在 ProjectName .Contexts中创建模板项的实例时,using语句将为:

使用 ProjectName .Models

问题在于我无法找到替换项目模板中的部件的方法。尽管我可以确定,$ projectname $和$ safeprojectname $仅适用于项目模板,而不适用于项目模板。

我的模板如下:

using System;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using $safeprojectname$.DAL.Models; // This is the problem line

namespace $rootnamespace$
{
    public class $safeitemrootname$
        : DbContext
    {
        // Constructors =======================================================
        public $safeitemrootname$()
            : base("$safeitemrootname$")
        {
        }

        // DBSets =============================================================
        // public DbSet<Company> Companies { get; set; }

        // Configuration ======================================================
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

更新

回应Hans的评论,当我尝试使用$ projectname $($ safeprojectname $做同样的事情)时,这里有输出:

using System;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using $projectname$.DAL.Models; // This is the problem line

如您所见,$ projectname $替换只会被忽略。

任何帮助将不胜感激,

杰森

4 个答案:

答案 0 :(得分:2)

如以下MSDN链接中所述:

https://msdn.microsoft.com/en-us/library/eehb4faa.aspx

只有在“新建项目”对话框中提到项目名称时才会出现项目名称。因此,如果您在现有项目中使用它,它将无法工作。见下面的截图:

Safe Project Name

答案 1 :(得分:2)

copyParameters="true"中添加Root.vstemplate,如下所示

 ProjectTemplateLink ProjectName="Domain.$projectname$" CopyParameters="true">

在代码中使用$ext_projectname$来解析项目名称

using Provider.$ext_projectname$

答案 2 :(得分:1)

我找到了一种解决方法 - 使用自定义模板向导,并在源代码管理资源管理器中检索当前选定的项目。

由于 CUSTOM 项目模板仅在解决方案树中选择项目节点时才能在“添加新”菜单中使用,因此可以确定项目名称(以及EnvDTE可用的所有其他信息)并添加到replacementmentsDictionary中。

using EnvDTE80;

public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams) 
{
    //Adding by template is unavailable in the context menu when selecting more than one item -> use index 0. 
    UIHierarchyItem selectedUiHierarchyItem = (UIHierarchyItem )dte.ToolWindows.SolutionExplorer.SelectedItems[0]; 

    //not null when selecting solution node (when adding a project)
    Solution selectedSolution = selectedUiHierarchyItem.Object as Solution 

    //not null when selecting project node (when adding an item) or when selecting a solution folder (when adding a project)
    Project selectedProject = selectedUiHierarchyItem.Object as Project;

    //Determine which kind of project node: 
    if (selectedProject != null)
    {
        if (selectedProject.Kind == EnvDTE.Constants.vsProjectKindSolutionItems)
        {
            //solution folder
        }
        else
        {
            //project
            replacementsDictionary.Add("$projectname$", selectedProject.Name);
        }
    }
}

答案 3 :(得分:1)

我的同事在工作中找到了一个修复它的参数来检测当前的项目名称。

$rootnamespace$