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) });
        }