protected virtual void DetachProjectBuilderEventHandlers(MSBuildProjectBuilder projectBuilder) { projectBuilder.ProjectFileCreated -= OnProjectFileCreated; projectBuilder.ProjectGenerationFailure -= OnProjectGenerationFailure; projectBuilder.ResourceWritingFailure -= OnResourceWritingFailure; projectBuilder.ExceptionThrown -= OnExceptionThrown; }
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(); }
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); }
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); } }
protected virtual void ConfigurateProjectBuilder(MSBuildProjectBuilder projectBuilder) { projectBuilder.ProjectFileCreated += OnProjectFileCreated; projectBuilder.ProjectGenerationFailure += OnProjectGenerationFailure; projectBuilder.ResourceWritingFailure += OnResourceWritingFailure; }
protected override void DetachProjectBuilderEventHandlers(MSBuildProjectBuilder projectBuilder) { }
protected override void ConfigurateProjectBuilder(MSBuildProjectBuilder projectBuilder) { }