Пример #1
0
 protected virtual void DetachProjectBuilderEventHandlers(MSBuildProjectBuilder projectBuilder)
 {
     projectBuilder.ProjectFileCreated       -= OnProjectFileCreated;
     projectBuilder.ProjectGenerationFailure -= OnProjectGenerationFailure;
     projectBuilder.ResourceWritingFailure   -= OnResourceWritingFailure;
     projectBuilder.ExceptionThrown          -= OnExceptionThrown;
 }
Пример #2
0
        protected TimeSpan RunInternal(AssemblyDefinition assembly, GeneratorProjectInfo projectInfo, ProjectGenerationSettings settings)
        {
            OnProjectGenerationStarted(assembly);

            string projFilePath = Path.Combine(projectInfo.Out, Path.GetFileNameWithoutExtension(projectInfo.Target) + projectInfo.Language.VSProjectFileExtension + (settings.JustDecompileSupportedProjectType ? string.Empty : MSBuildProjectBuilder.ErrorFileExtension));

            DecompilationPreferences preferences = new DecompilationPreferences();

            preferences.WriteFullNames       = false;
            preferences.WriteDocumentation   = projectInfo.AddDocumentation;
            preferences.RenameInvalidMembers = projectInfo.RenameInvalidMembers;

            IFrameworkResolver    frameworkResolver = new ConsoleFrameworkResolver(projectInfo.FrameworkVersion);
            MSBuildProjectBuilder projectBuilder    = GetProjectBuilder(assembly, projectInfo, settings, projectInfo.Language, projFilePath, preferences, frameworkResolver);

            AttachProjectBuilderEventHandlers(projectBuilder);

            //As per https://github.com/telerik/JustDecompileEngine/pull/2
            DateTime startTime = DateTime.UtcNow;

            projectBuilder.BuildProject();
            TimeSpan projectGenerationTime = DateTime.UtcNow - startTime;

            DetachProjectBuilderEventHandlers(projectBuilder);

            return(projectGenerationTime);
        }
        private void BuildProject(string target, string output)
        {
            if (Directory.Exists(output))
            {
                Directory.Delete(output, true);
            }

            Directory.CreateDirectory(output);

            MSBuildProjectBuilder projectBuilder = CreateProjectBuilder(target, output);

            projectBuilder.BuildProject();
        }
Пример #4
0
        private BaseProjectBuilder GetProjectBuilder(AssemblyDefinition assembly, GeneratorProjectInfo projectInfo, ProjectGenerationSettings settings, ILanguage language, string projFilePath, DecompilationPreferences preferences, IFrameworkResolver frameworkResolver, ITargetPlatformResolver targetPlatformResolver)
        {
            TargetPlatform     targetPlatform = targetPlatformResolver.GetTargetPlatform(assembly.MainModule.FilePath, assembly.MainModule);
            BaseProjectBuilder projectBuilder = null;

            if (targetPlatform == TargetPlatform.NetCore)
            {
                projectBuilder = new NetCoreProjectBuilder(projectInfo.Target, projFilePath, language, preferences, null, NoCacheAssemblyInfoService.Instance, projectInfo.VisualStudioVersion, settings);
            }
            else if (targetPlatform == TargetPlatform.WinRT)
            {
                projectBuilder = new WinRTProjectBuilder(projectInfo.Target, projFilePath, language, preferences, null, NoCacheAssemblyInfoService.Instance, projectInfo.VisualStudioVersion, settings);
            }
            else
            {
                projectBuilder = new MSBuildProjectBuilder(projectInfo.Target, projFilePath, language, frameworkResolver, preferences, null, NoCacheAssemblyInfoService.Instance, projectInfo.VisualStudioVersion, settings);
            }

            return(projectBuilder);
        }
Пример #5
0
        private static void RefreshGeneratedOutput(bool forceGenerateEverything, bool forceCompleteGeneration)
        {
            // In this method, the following must happen
            // - Clean up builds if necessary
            // - Generate the common props file if necessary
            // - Regenerate everything else if necessary
            // - Build if the clean was done

            BuildTarget           currentBuildTarget = EditorUserBuildSettings.activeBuildTarget;
            ApiCompatibilityLevel targetFramework    = PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.selectedBuildTargetGroup);

            bool buildTargetOrFrameworkChanged = EditorPrefs.GetInt($"{nameof(MSBuildTools)}.{nameof(currentBuildTarget)}") != (int)currentBuildTarget ||
                                                 EditorPrefs.GetInt($"{nameof(MSBuildTools)}.{nameof(targetFramework)}") != (int)targetFramework ||
                                                 forceGenerateEverything;

            if (buildTargetOrFrameworkChanged || CSProjectAssetRemoved)
            {
                // We clean up previous build if the EditorPrefs currentBuildTarget or targetFramework is different from current ones.
                // Or a CS Project file has been removed and we need to clean up
                MSBuildProjectBuilder.TryBuildAllProjects(MSBuildProjectBuilder.CleanProfileName);
            }

            // Get the token file in the Unity Temp directory, if it exists.
            Version tokenVerison = GetCurrentTokenVersion();

            // We regenerate, if the token file exists, and it's current version.
            bool doesCurrentVersionTokenFileExist = tokenVerison != null && tokenVerison == MSBuildForUnityVersion;

            // We perform the regeneration of complete or partial pass in the following cases:
            // - forceGenerateEverything is true (we are told to)
            // - buildTargetOrFrameworkChanged is true (target framework changed)
            // - doesCurrentVersionTokenFileExist is false (version changed, or editor just opened)
            // - CSProjectAssetChanged is true (a csproj file has been added)
            // - AssemblyDefinitionAssetChanged is true and Config.FullGenerationEnabled is true (asmdef change and full regen is enabled that will gen based off asmdefs)

            // - AutoGenerateEnabled and token file doesn't exist or shouldClean is true
            bool performRegeneration = forceGenerateEverything || buildTargetOrFrameworkChanged || !doesCurrentVersionTokenFileExist || CSProjectAssetChanged ||
                                       (AssemblyDefinitionAssetChanged && Config.FullGenerationEnabled);

            // Reset the values after using them
            CSProjectAssetChanged          = false;
            AssemblyDefinitionAssetChanged = false;
            CSProjectAssetRemoved          = false;

            if (performRegeneration || unityProjectInfo == null)
            {
                // Create the project info only if it's null or we need to regenerate
                unityProjectInfo = new UnityProjectInfo(Debug.unityLogger, SupportedBuildTargets, Config, Config.FullGenerationEnabled || forceCompleteGeneration);
            }

            if (performRegeneration)
            {
                // If we are forced complete, then we regenerate, otherwise perform the one that is selected
                RegenerateEverything(unityProjectInfo, Config.FullGenerationEnabled || forceCompleteGeneration);
            }

            if (!doesCurrentVersionTokenFileExist)
            {
                foreach (string tokenFile in Directory.GetFiles(Path.Combine(Utilities.ProjectPath, "Temp"), "*_token.msb4u", SearchOption.TopDirectoryOnly))
                {
                    File.Delete(tokenFile);
                }

                File.Create(Path.Combine(Utilities.ProjectPath, "Temp", $"{MSBuildForUnityVersion.ToString(3)}_token.msb4u"))
                .Dispose();
            }

            // Write the current targetframework and build target
            EditorPrefs.SetInt($"{nameof(MSBuildTools)}.{nameof(currentBuildTarget)}", (int)currentBuildTarget);
            EditorPrefs.SetInt($"{nameof(MSBuildTools)}.{nameof(targetFramework)}", (int)targetFramework);

            // If we cleaned, now build, or if we regenerated
            if (buildTargetOrFrameworkChanged || performRegeneration)
            {
                MSBuildProjectBuilder.TryBuildAllProjects(MSBuildProjectBuilder.BuildProfileName);
            }
        }
Пример #6
0
 protected virtual void ConfigurateProjectBuilder(MSBuildProjectBuilder projectBuilder)
 {
     projectBuilder.ProjectFileCreated       += OnProjectFileCreated;
     projectBuilder.ProjectGenerationFailure += OnProjectGenerationFailure;
     projectBuilder.ResourceWritingFailure   += OnResourceWritingFailure;
 }
Пример #7
0
 protected override void DetachProjectBuilderEventHandlers(MSBuildProjectBuilder projectBuilder)
 {
 }
Пример #8
0
 protected override void ConfigurateProjectBuilder(MSBuildProjectBuilder projectBuilder)
 {
 }