public void Export(Stream outStream, PlatformExportImportOptions exportOptions, Action<ExportImportProgressInfo> progressCallback) { if (exportOptions == null) { throw new ArgumentNullException("exportOptions"); } var progressInfo = new ExportImportProgressInfo { Description = "Start platform export...", TotalCount = exportOptions.Modules.Count(), ProcessedCount = 0 }; progressCallback(progressInfo); using (var package = ZipPackage.Open(outStream, FileMode.Create)) { var exportModulesInfo = new List<ExportModuleInfo>(); foreach (var module in exportOptions.Modules) { //Create part for module var modulePartUri = PackUriHelper.CreatePartUri(new Uri(module.Id, UriKind.Relative)); var modulePart = package.CreatePart(modulePartUri, System.Net.Mime.MediaTypeNames.Application.Octet, CompressionOption.Normal); progressInfo.Description = String.Format("{0}: export started.", module.Id); progressCallback(progressInfo); Action<ExportImportProgressInfo> modulePorgressCallback = (x) => { progressInfo.Description = String.Format("{0}: {1}", module.Id, x.Description); progressCallback(progressInfo); }; ((ISupportExportModule)module.ModuleInfo.ModuleInstance).DoExport(modulePart.GetStream(), modulePorgressCallback); //Register in manifest var moduleManifestPart = new ExportModuleInfo { ModuleId = module.Id, ModuleVersion = module.Version, PartUri = modulePartUri.ToString() }; exportModulesInfo.Add(moduleManifestPart); progressInfo.Description = String.Format("{0}: export finished.", module.Id); progressInfo.ProcessedCount++; progressCallback(progressInfo); } //Write system information about exported modules var manifestPart = package.CreatePart(_manifestPartUri, System.Net.Mime.MediaTypeNames.Text.Xml); var manifest = new PlatformExportManifest { Author = exportOptions.Author, Created = DateTime.UtcNow, PlatformVersion = exportOptions.PlatformVersion.ToString(), Modules = exportModulesInfo.ToArray(), }; //After all modules exported need write export manifest part using (var streamWriter = new StreamWriter(manifestPart.GetStream())) { streamWriter.Write(manifest.SerializeXML()); } } }