コード例 #1
0
            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}"));
                    }
                }
            }
コード例 #2
0
        /// <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);
            }
        }