/// <summary>
 /// Loads project invocation rules for the active workbook.
 /// </summary>
 private void ReadRules()
 {
     Excel.Workbook workbook = ActiveWorkbook;
     Excel.Worksheet ws = GetRulesWorksheet(workbook);
     if (ws == null) {
         Mode = ExecutionMode.Synchronous;
         Rules = new ProjectInvocationRule[0];
     }
     else {
         NamedRangeProvider nrp = NamedRangeProvider;
         nrp.Clear();
         var prm = new PersistedRuleManager();
         prm.Load(this, nrp, ws, out m_mode, out m_rules);
         RationaliseRuleIds();
         UpdateExecutionState();
     }
 }
 /// <summary>
 /// Stores the active workbook's current project invocation rules within the workbook.
 /// </summary>
 public void WriteRules()
 {
     ProjectInvocationRule[] rules = Rules;
     Excel.Workbook wb = ActiveWorkbook;
     Excel.Worksheet ws = GetRulesWorksheet(wb);
     if (ws == null) {
         if (rules == null || (!rules.Any() && Mode == ExecutionMode.Synchronous)) return;
         ws = (Excel.Worksheet)wb.Worksheets.Add();
         ws.Name = s_rulesSheetName;
         ws.Visible = Excel.XlSheetVisibility.xlSheetVeryHidden;
     }
     var prm = new PersistedRuleManager();
     prm.Save(ws, Mode, rules);
 }