예제 #1
0
        public static int GetResourcesCount(Dictionary <ModuleDefinition, Collection <Resource> > resources, bool decompileDangerousResources)
        {
            int result = 0;

            foreach (Collection <Resource> moduleResources in resources.Values)
            {
                foreach (Resource resource in moduleResources)
                {
                    if (!decompileDangerousResources && DangerousResourceIdentifier.IsDangerousResource(resource))
                    {
                        continue;
                    }

                    if (resource.ResourceType != ResourceType.Embedded)
                    {
                        continue;
                    }

                    EmbeddedResource embeddedResource = (EmbeddedResource)resource;
                    if (resource.Name.EndsWith(".g.resources", StringComparison.OrdinalIgnoreCase))
                    {
                        using (ResourceReader resourceReader = new ResourceReader(embeddedResource.GetResourceStream()))
                        {
                            result += resourceReader.OfType <System.Collections.DictionaryEntry>().Count();
                        }
                    }
                    else
                    {
                        result++;
                    }
                }
            }

            return(result);
        }
예제 #2
0
        private static bool ExistsResourceForType(string typeFullName, AssemblyDefinition assembly, bool decompileDangerousResources)
        {
            foreach (ModuleDefinition module in assembly.Modules)
            {
                foreach (Resource resource in module.Resources)
                {
                    if (!decompileDangerousResources && DangerousResourceIdentifier.IsDangerousResource(resource))
                    {
                        continue;
                    }

                    if (resource.ResourceType != ResourceType.Embedded)
                    {
                        continue;
                    }

                    EmbeddedResource embeddedResource = (EmbeddedResource)resource;
                    if (resource.Name.EndsWith(".resources", StringComparison.OrdinalIgnoreCase))
                    {
                        if (!embeddedResource.Name.EndsWith(".g.resources", StringComparison.OrdinalIgnoreCase))
                        {
                            string resourceName = embeddedResource.Name.Substring(0, embeddedResource.Name.Length - 10);                             //".resources".Length == 10
                            if (resourceName == typeFullName)
                            {
                                return(true);
                            }
                        }
                    }
                }
            }

            return(false);
        }
예제 #3
0
        private bool ShouldDecompileDangerousResources(AssemblyDefinition assembly, string assemblyPath, AssemblyType assemblyType)
        {
            try
            {
                Dictionary <ModuleDefinition, Mono.Collections.Generic.Collection <Resource> > assemblyResources = Utilities.GetResources(assembly);

                bool containsDangerousResources = assemblyResources.SelectMany(rc => rc.Value)
                                                  .Any(resource => DangerousResourceIdentifier.IsDangerousResource(resource));

                bool decompileDangerousResources = false;
                if (containsDangerousResources)
                {
                    DispatcherObjectExt.Invoke(() =>
                    {
                        DangerousResourceDialog dialog = new DangerousResourceDialogWithAnalyticsTracking(Path.GetFileName(assemblyPath), assemblyType);
                        if (dialog.Show() == DangerousResourceDialogResult.Yes)
                        {
                            decompileDangerousResources = true;
                        }
                    });
                }

                return(decompileDangerousResources);
            }
            catch (Exception)
            {
                return(false);
            }
        }
        protected void CreateResources(ModuleDefinition module)
        {
            string targetDir = Path.GetDirectoryName(this.TargetPath);

            foreach (Resource resource in module.Resources)
            {
                try
                {
                    if (!this.decompilationPreferences.DecompileDangerousResources &&
                        DangerousResourceIdentifier.IsDangerousResource(resource))
                    {
                        continue;
                    }

                    if (resource.ResourceType != ResourceType.Embedded)
                    {
                        continue;
                    }

                    EmbeddedResource   embeddedResource = (EmbeddedResource)resource;
                    IFileGeneratedInfo args;
                    if (resource.Name.EndsWith(".resources", StringComparison.OrdinalIgnoreCase))
                    {
                        if (!embeddedResource.Name.EndsWith(".g.resources", StringComparison.OrdinalIgnoreCase))
                        {
                            string resourceName         = embeddedResource.Name.Substring(0, embeddedResource.Name.Length - 10); //".resources".Length == 10
                            string relativeResourcePath = resourcesToPathsMap[resource];
                            string fullResourcePath     = Path.Combine(targetDir, relativeResourcePath);

                            if (TryCreateResXFile(embeddedResource, fullResourcePath))
                            {
                                this.projectFileManager.ResourceDesignerMap.Add(resourceName, relativeResourcePath);
                                args = new FileGeneratedInfo(fullResourcePath, false);
                                OnProjectFileCreated(args);
                            }
                        }
                        else
                        {
                            ProcessXamlResources(embeddedResource, module);
                        }
                    }
                    else
                    {
                        string resourceLegalName = resourcesToPathsMap[resource];
                        string resourceFullPath  = Path.Combine(targetDir, resourceLegalName);
                        using (FileStream fileStream = new FileStream(resourceFullPath, FileMode.Create, FileAccess.Write))
                        {
                            embeddedResource.GetResourceStream().CopyTo(fileStream);
                        }

                        this.projectFileManager.AddResourceToOtherEmbeddedResources(resourceLegalName);

                        args = new FileGeneratedInfo(resourceFullPath, false);
                        OnProjectFileCreated(args);
                    }
                }
                catch (Exception ex)
                {
                    if (ResourceWritingFailure != null)
                    {
                        ResourceWritingFailure(this, resource.Name, ex);
                    }

                    if (this.projectNotifier != null)
                    {
                        this.projectNotifier.OnResourceWritingFailure(resource.Name, ex);
                    }
                }
            }
        }
        public Dictionary <Resource, string> GetResourcesToFilePathsMap()
        {
            Dictionary <Resource, string> result = new Dictionary <Resource, string>();

            List <Resource> flattenedResources = new List <Resource>();
            Dictionary <Resource, string> flattenedResourcesFileNames = new Dictionary <Resource, string>();

            foreach (KeyValuePair <ModuleDefinition, Mono.Collections.Generic.Collection <Resource> > moduleResources in this.resources)
            {
                foreach (Resource resource in moduleResources.Value)
                {
                    if (!this.decompileDangerousResources &&
                        DangerousResourceIdentifier.IsDangerousResource(resource))
                    {
                        continue;
                    }

                    if (resource.ResourceType != ResourceType.Embedded)
                    {
                        continue;
                    }

                    EmbeddedResource embeddedResource = (EmbeddedResource)resource;
                    if (resource.Name.EndsWith(".resources", StringComparison.OrdinalIgnoreCase))
                    {
                        if (!embeddedResource.Name.EndsWith(".g.resources", StringComparison.OrdinalIgnoreCase))
                        {
                            string resourceName         = embeddedResource.Name.Substring(0, embeddedResource.Name.Length - 10);                     //".resources".Length == 10
                            string relativeResourcePath = GetResourceFilePath(resourceName);
                            result.Add(resource, relativeResourcePath);

                            if (relativeResourcePath.Length > maxRelativePathLength || Path.GetDirectoryName(relativeResourcePath) == "")
                            {
                                flattenedResources.Add(resource);

                                string resourceFileName = Path.GetFileName(relativeResourcePath);
                                flattenedResourcesFileNames.Add(resource, resourceFileName);
                                result[resource] = Path.GetFileName(resourceFileName);
                            }
                        }
                    }
                    else
                    {
                        string resourceLegalName = Utilities.GetLegalFileName(resource.Name);
                        result.Add(resource, resourceLegalName);

                        // such resources are always in the root directory of the project,
                        // so we add them, like the "" namespace types in GetTypesToFilePathsMap algorithm
                        flattenedResources.Add(resource);
                        flattenedResourcesFileNames.Add(resource, resourceLegalName);
                    }
                }
            }

            // now we've got some resources flattened, we must fix any collisions and
            // after that rename any resources with still long paths.
            // note that if we have any code file along a resource, its path will
            // surely be with shorter path, since ".resx".Length() > ".cs"/".vb".Length()

            FixResourcesCollisions(result, flattenedResources, flattenedResourcesFileNames);

            HashSet <string> usedNames = new HashSet <string>();

            foreach (Resource resource in flattenedResources)
            {
                usedNames.Add(result[resource]);
            }

            int longResourcesNamesCount = 0;

            foreach (Resource resource in flattenedResources)
            {
                string currentResourceName = result[resource];
                string resourceExtension   = Path.GetExtension(currentResourceName);
                if (currentResourceName.Length + sourceExtension.Length > maxRelativePathLength)
                {
                    longResourcesNamesCount++;
                    string nameCandidate = ResourcesShortNameStartSymbol + longResourcesNamesCount + resourceExtension;
                    while (usedNames.Contains(nameCandidate))
                    {
                        longResourcesNamesCount++;
                        nameCandidate = ResourcesShortNameStartSymbol + longResourcesNamesCount + resourceExtension;
                    }
                    usedNames.Remove(currentResourceName);
                    usedNames.Add(nameCandidate);
                    result[resource] = nameCandidate;
                }
            }

            return(result);
        }
예제 #6
0
        public override Task <GetProjectCreationMetadataResponse> GetProjectCreationMetadata(GetProjectCreationMetadataRequest request, ServerCallContext context)
        {
            VisualStudioVersion       visualStudioVersion = this.GetProjectCreationVSVersion(request.ProjectVisualStudioVersion);
            AssemblyDefinition        assemblyDefinition  = GlobalAssemblyResolver.Instance.GetAssemblyDefinition(request.AssemblyFilePath);
            ILanguage                 language            = LanguageFactory.GetLanguage(CSharpVersion.V7);
            ProjectGenerationSettings settings            = ProjectGenerationSettingsProvider.GetProjectGenerationSettings(request.AssemblyFilePath, NoCacheAssemblyInfoService.Instance,
                                                                                                                           EmptyResolver.Instance, visualStudioVersion, language, TargetPlatformResolver.Instance);
            bool   containsDangerousResources       = assemblyDefinition.Modules.SelectMany(m => m.Resources).Any(r => DangerousResourceIdentifier.IsDangerousResource(r));
            string normalizedVSProjectFileExtension = language.VSProjectFileExtension.TrimStart('.');
            string generatedProjectExtension        = normalizedVSProjectFileExtension + (settings.JustDecompileSupportedProjectType ? string.Empty : MSBuildProjectBuilder.ErrorFileExtension);

            return(Task.FromResult(new GetProjectCreationMetadataResponse()
            {
                ContainsDangerousResources = containsDangerousResources,
                ProjectFileMetadata = new ProjectFileMetadata()
                {
                    IsDecompilerSupportedProjectType = settings.JustDecompileSupportedProjectType,
                    IsVSSupportedProjectType = settings.VisualStudioSupportedProjectType,
                    ProjectTypeNotSupportedErrorMessage = settings.ErrorMessage ?? string.Empty,
                    ProjectFileName = assemblyDefinition.Name.Name,
                    ProjectFileExtension = generatedProjectExtension
                }
            }));
        }