/// <summary>
 /// Clones the supplied ProjectInvocationRule instances.
 /// </summary>
 private static ProjectInvocationRule[] GetClones(ProjectInvocationRule[] rules)
 {
     return rules == null ? null : rules.Select(r => r.Clone()).ToArray();
 }
 /// <summary>
 /// Returns a list of ProjectInvocationRule ids that cannot be changed.
 /// </summary>
 /// <remarks>
 /// A ProjectInvocationRule's id cannot be changed if this WorkbookRuntimeAdapter is already
 /// managing an execution slot for it.
 /// </remarks>
 private IList<int> GetImmutableIds(ProjectInvocationRule[] rules)
 {
     lock (m_ruleState) {
         return new List<int>(rules.Select(r => r.Id).Intersect(m_ruleState.Keys));
     }
 }