C#自定义项目模板

时间:2013-06-02 17:29:30

标签: c# visual-studio-2010 visual-studio templates visual-studio-2012

我正在为C#创建自己的项目模板,其中包含更多项目。

我在其中添加了自己的向导。这很有效。

但是,当我尝试将我的一些项目自定义参数添加到替换字典中时,在我的向导库中,我在项目中获得原始值(未替换)( it保持为“$ connectionString $”)。

例如,如果我在 RunStarted 方法中添加这段代码:

private string _connectionString = "Lorem ipsum for example";
public void RunStarted(object automationObject, Dictionary<string, string>replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
    replacementsDictionary.Add("$connectionString$", _connectionString);
}

在我的web.config中:

<connectionStrings>
    <add name="DAL.Database.Properties.Settings.MyConnectionString" connectionString="$connectionString$" providerName="System.Data.SqlClient" />
</connectionStrings>  

即使在我的 .vstemplate 文件中,我看到此文件已标记为检查和修改paramas:

<ProjectItem ReplaceParameters="true" OpenInEditor="true" TargetFileName="Web.config">Web.config</ProjectItem>

注意:仅当我将硬编码值放在 .vstemplate 文件中时才有效,例如:

<CustomParameters>
    <CustomParameter Name="$connectionString$" Value="Some dummy value" />
</CustomParameters>

但这不是我想要的。 现在我想知道,有什么问题可以解决?

1 个答案:

答案 0 :(得分:1)

我终于找到了解决此问题的方法。

要从实现 IWizard 界面的类库中传递自定义参数,您必须创建自己的字典,然后放置自定义数据。

然后将数据从那里复制到 replacementsDictionary 字典。

这是一个示例,您如何共享填充了要在多个项目模板之间替换的值的相同字典:

private static Dictionary<string, string> _sharedDictionary = new Dictionary<string, string>();

public void RunStarted(object automationObject,
        Dictionary<string, string> replacementsDictionary,
        WizardRunKind runKind, object[] customParams)
    {
        if (runKind == WizardRunKind.AsMultiProject)
        {
            try
            {                    
                _sharedDictionary.Add("$connectionString$", connectionString);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        if (_sharedDictionary != null)
        {
            foreach (KeyValuePair<string, string> dictItem in _sharedDictionary)
            {
                if (!replacementsDictionary.ContainsKey(dictItem.Key))
                {
                    replacementsDictionary.Add(dictItem.Key, dictItem.Value);
                }
            }
        }
    }

因为 _sharedDictionary 被标记为静态,所有实例将共享相同的字典,并且所有项目模板中都将提供需要替换的值。

此外,请不要忘记在所有链接的项目中加入 .vstemplate 文件 WizardExtension 部分。