public void ValidateAssets(bool alwaysGenerateNewAssetId = false) { if (TemporaryAssets.Count == 0) { return; } try { // Make sure we are suspending notifications before updating all assets Assets.SuspendCollectionChanged(); Assets.Clear(); // Get generated output items var outputItems = new AssetItemCollection(); // Create a resolver from the package var resolver = AssetResolver.FromPackage(this); resolver.AlwaysCreateNewId = alwaysGenerateNewAssetId; // Clean assets AssetCollision.Clean(this, TemporaryAssets, outputItems, resolver, true); // Add them back to the package foreach (var item in outputItems) { Assets.Add(item); } // Don't delete SourceCodeAssets as their files are handled by the package upgrader var dirtyAssets = outputItems.Where(o => o.IsDirty && !(o.Asset is SourceCodeAsset)) .Join(TemporaryAssets, o => o.Id, t => t.Id, (o, t) => t) .ToList(); // Dirty assets (except in system package) should be mark as deleted so that are properly saved again later. if (!IsSystem && dirtyAssets.Count > 0) { IsDirty = true; lock (filesToDelete) { filesToDelete.AddRange(dirtyAssets.Select(a => a.FullPath)); } } TemporaryAssets.Clear(); } finally { // Restore notification on assets Assets.ResumeCollectionChanged(); } }