我正在为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>
但这不是我想要的。 现在我想知道,有什么问题可以解决?
答案 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 部分。