public void Write(string cacheFolder, string pluginsFolder, string pattern, SearchOption searchOption) { var serializer = new XmlSerializer(typeof(List <SerializableComposablePartDefinition>)); var assemblyFiles = Directory.GetFiles(pluginsFolder, pattern, searchOption); foreach (var assemblyFile in assemblyFiles) { var fileTime = File.GetLastWriteTime(assemblyFile); var cachedDataFile = Path.Combine(cacheFolder, $"{Path.GetFileName(assemblyFile)}.{fileTime:yyyyMMddHHmmss}.{lazyAssemblyLoadingDataFileExtension}"); if (File.Exists(cachedDataFile)) { continue; } using (var assemblyCatalog = new AssemblyCatalog(assemblyFile)) { var manifest = assemblyCatalog.Assembly.ManifestModule; var oldFiles = Directory.GetFiles(cacheFolder, $"{manifest.Name}.*.*"); foreach (var oldFile in oldFiles) { File.Delete(oldFile); } cachedDataFile = $"{cacheFolder}\\{manifest.Name}.00000000000000.{lazyAssemblyLoadingDataFileExtension}"; var partsData = new List <SerializableComposablePartDefinition>(); try { partsData = assemblyCatalog.Select(SerializableComposablePartDefinition.FromComposablePartDefinition).ToList(); } catch { // ignored } using (var output = File.Open(cachedDataFile, FileMode.Create, FileAccess.Write)) { serializer.Serialize(output, partsData); } fileTime = File.GetLastWriteTime(assemblyFile); File.Move(cachedDataFile, cachedDataFile.Replace($"00000000000000.{lazyAssemblyLoadingDataFileExtension}", $"{fileTime:yyyyMMddHHmmss}.{lazyAssemblyLoadingDataFileExtension}")); } } }
/// <summary> /// Serializes an assembly's part information to a file. /// </summary> /// <param name="assembly">The assembly to serialize the part information for.</param> /// <param name="outputDataFile">The path to the file that will hold the assembly's serialization information.</param> /// <exception cref="ArgumentNullException">Thrown if <paramref name="assembly"/> is null.</exception> /// <exception cref="ArgumentNullException">Thrown if <paramref name="outputDataFile"/> is null or empty.</exception> public static void SerializeAssemblyPartInformation(Assembly assembly, string outputDataFile) { if (assembly == null) { throw new ArgumentNullException("assembly"); } if (string.IsNullOrEmpty(outputDataFile)) { throw new ArgumentNullException("outputDataFile"); } var assemblyCatalog = new AssemblyCatalog(assembly); var parts = assemblyCatalog.Select(SerializableComposablePartDefinition.FromComposablePartDefinition).ToList(); var serializer = new XmlSerializer(typeof(List <SerializableComposablePartDefinition>)); using (var output = File.Open(outputDataFile, FileMode.Create, FileAccess.Write)) { serializer.Serialize(output, parts); } }