private string CreateXaml(ResourceNavigationUtil.ResourceNavigationData data) { try { using (var ms = new MemoryStream()) { Lifetimes.Using( lt => { using (var sourceStream = data.ReaderFactory(lt)) sourceStream.CopyTo(ms); }); ms.Position = 0; var bamlTranslator = new BamlTranslator(ms); return(bamlTranslator.ToString()); } } catch (Exception e) { Logger.LogException(string.Format("Error while decoding {0} from {1}", data.Moniker, data.Assembly.FullAssemblyName), e); } return(null); }
public IEnumerable <INavigationPoint> CreateNavigationPoints(object target, IEnumerable <INavigationPoint> basePoints) { var navigationInfo = target as NetResourceEntryData; if (navigationInfo == null) { return(basePoints); } string resourceName = navigationInfo.EntryName; if (!resourceName.EndsWith(BamlExtension, StringComparison.OrdinalIgnoreCase)) { return(basePoints); } string fileName = resourceName.TrimFromEnd(BamlExtension, StringComparison.OrdinalIgnoreCase) + XamlExtension; foreach (var invalidFileNameChar in FileSystemDefinition.InvalidFileNameChars) { fileName = fileName.Replace(invalidFileNameChar, '_'); } IAssembly assembly = navigationInfo.Assembly; var cacheItem = myDecompilationCache.GetCacheItem(DecompilerId, assembly, resourceName, fileName); if (cacheItem == null || cacheItem.Expired) { ResourceNavigationUtil.ResourceNavigationData resource = ResourceNavigationUtil.ReadResource(navigationInfo); if (resource != null) { var content = CreateXaml(resource); if (content != null) { cacheItem = myDecompilationCache.PutCacheItem(DecompilerId, assembly, resourceName, fileName, new Dictionary <string, string>(), content); } } } if (cacheItem == null) { return(basePoints); } return(new[] { myExternalSourcesNavigator.CreateNavigationPoint(cacheItem.Location, new TextRange(0), assembly.FullAssemblyName, PresentableName) }); }