2

Я создаю свой собственный шаблон проекта для C#, который содержит больше проектов внутри.C# пользовательский шаблон проекта

Я добавил в него свой собственный мастер. И это отлично работает.

Но, когда я пытаюсь поставить в некоторых из моих проектов пользовательских пар, добавлены заменами словаря, в моей библиотеке мастера я получаю исходное значение (не заменить) в моем проекте (он остается как «$ 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 Я вижу, что этот файл помечен для проверки и изменения параметров:

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

Примечание: Это работает только если я ставлю жёстко прописанные значение в .vstemplate файл, как это, например:

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

Но это не то, что я хочу. И теперь мне интересно, что может быть проблемой?

ответ

1

Я, наконец, нашел решение этой проблемы.

Чтобы передать пользовательские параметры из вашей библиотеки классов, которая реализует интерфейсIWizard, вам придется создать свой собственный словарь, и поместить пользовательские данные.

Затем скопируйте данные оттуда на заметок. Словарь словарь.

Это пример того, как вы можете поделиться тот же словарь, заполненный значениями, которые вы хотите заменить между несколькими шаблонами проекта:

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 раздела.

Смежные вопросы