2012-03-21 3 views
0

Мне нужно изменить machine.config во время процедуры установки. Я знаю, что мне нужно использовать компонент XMLConfig, но до сих пор не все ясно для меня:wix XmlConfig синтаксис

  • Как я выяснил, Util: XmlConfig тег должен быть размещен внутри тега компонента. Тег компонента должен быть помещен в тег Directory. Должен ли я создавать тег определения каталога с уникальным идентификатором для использования с util: XmlConfig? Можете ли вы предоставить очень минимальный образец с полным определением компонентов и каталогов, которые я должен использовать в своем случае, чтобы я понял, как это работает?

  • Мне нужно изменить файл machine.config, путь выглядит так:
    File = "[WindowsFolder] Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ machine.config".
    Но это хорошая идея, чтобы обеспечить такой путь? Может быть, я скорее должен получить этот путь автоматически (я имею в виду номер версии каркаса .net) - это возможно?

  • Мне нужно добавить запись DbProviderFactories в machine.config. Что делать, если записи, которые я хочу добавить, уже присутствуют в файле? Они будут добавлены снова, заменены? Если они будут добавлены дважды, как я могу это предотвратить?

+1

Вы уверены, что вам нужно изменить machine.config? Вы можете поместить свои настройки DbProviderFactory в файл web.config или app.config ... Делает это проще, используя XmlConfig. – Will

+0

Мне нужно изменить файл machine.config bacause, когда я регистрирую поставщика локально. – user1209216

ответ

0

Если вам нужно (как я полагаю) использовать Entity Framework, вы не должны изменять файл machine.config. Это может быть опасно, поскольку вы можете непреднамеренно сделать его непоследовательным.

Вместо этого, вы можете сделать следующий трюк:

  1. Получить данные конфигурации, которые уже прочитаны CLR:

    var dataSet = ConfigurationManager.GetSection("system.data") as System.Data.DataSet; 
    
  2. Затем проверьте первую таблицу и третий столбец в таблице для инвариантного имени вашего провайдера:

    bool bFound = false; 
    foreach (DataRow row in dataSet.Tables[0].Rows) 
    { 
         if (row[2].ToString() == "EFOracleProvider") 
         { 
          bFound = true; 
          break; 
         } 
    } 
    // if this provider is not already listed in the table, then add it 
    // set oracle provider parameters 
    if (!bFound) 
    { 
         dataSet.Tables[0].Rows.Add(
           provName, 
           provDesc, 
           provInvariant, 
           provAssembly 
         ); 
    } 
    

Конечно, вы должны это сделать до Первое создание ObjectContext.

+0

По какой-то причине он работает только тогда, когда разъем зарегистрирован глобально. Если я зарегистрирую код или app.config, всегда сбой приложения. Вероятно, это связано с привязкой данных wpf к ресурсам, и я не знаю, как это исправить (и не успеваем это выяснить). Поэтому я решил зарегистрировать соединитель по всему миру - я попытался вручную отредактировать файл machine.config, и он сработал. – user1209216

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