/// <summary> /// Refreshes the <see cref="ComposablePartDefinition"/>s with the latest files in the directory that match /// the searchPattern. If any files have been added they will be added to the catalog and if any files were /// removed they will be removed from the catalog. For files that have been removed keep in mind that the /// assembly cannot be unloaded from the process so <see cref="ComposablePartDefinition"/>s for those files /// will simply be removed from the catalog. /// /// Possible exceptions that can be thrown are any that <see cref="Directory.GetFiles(string, string)"/>. /// </summary> /// <exception cref="DirectoryNotFoundException"> /// The specified path has been removed since object construction. /// </exception> public void Refresh() { ThrowIfDisposed(); ComposablePartDefinition[] addedDefinitions; ComposablePartDefinition[] removedDefinitions; object changeReferenceObject; string[] afterFiles; string[] beforeFiles; while (true) { afterFiles = GetFiles(); lock (_thisLock) { changeReferenceObject = _loadedFiles; beforeFiles = _loadedFiles.ToArray(); } var newCatalog = ExecuteScripts(afterFiles); // Notify listeners to give them a preview before completing the changes addedDefinitions = newCatalog.ToArray(); removedDefinitions = _catalog.ToArray(); using (var atomicComposition = new AtomicComposition()) { var changingArgs = new ComposablePartCatalogChangeEventArgs(addedDefinitions, removedDefinitions, atomicComposition); OnChanging(changingArgs); // if the change went through then write the catalog changes lock (_thisLock) { if (changeReferenceObject != _loadedFiles) { // Someone updated the list while we were diffing so we need to try the diff again continue; } _catalog = newCatalog; _loadedFiles = afterFiles.ToReadOnlyCollection(); // Lastly complete any changes added to the atomicComposition during the change event atomicComposition.Complete(); // Break out of the while(true) break; } // WriteLock } // AtomicComposition } // while (true) var changedArgs = new ComposablePartCatalogChangeEventArgs(addedDefinitions, removedDefinitions, null); OnChanged(changedArgs); }