コード例 #1
0
        public async Task <IWorkspaceProjectContext> CreateProjectContextAsync(ConfiguredProject project)
        {
            Requires.NotNull(project, nameof(project));

            ProjectContextInitData data = await GetProjectContextInitDataAsync(project);

            if (data.IsInvalid())
            {
                return(null);
            }

            object hostObject = _project.Services.HostObject;

            IWorkspaceProjectContext context = await CreateProjectContextHandlingFaultAsync(data, hostObject);

            if (context == null)
            {
                return(null);
            }

            // Wrap to enforce UI-thread
            context = new ForegroundWorkspaceProjectContext(_threadingService, context);

            _activeWorkspaceProjectContextTracker.RegisterContext(context, data.WorkspaceProjectContextId);

            return(context);
        }
コード例 #2
0
        private async Task <ProjectContextInitData> GetProjectContextInitDataAsync(ConfiguredProject project)
        {
            Guid projectGuid = await _projectGuidService.GetProjectGuidAsync();

            IProjectRuleSnapshot snapshot = await GetLatestSnapshotAsync(project);

            return(ProjectContextInitData.GetProjectContextInitData(snapshot, projectGuid, project.ProjectConfiguration));
        }
            public static ProjectContextInitData GetProjectContextInitData(IProjectRuleSnapshot snapshot, Guid projectGuid, ProjectConfiguration configuration)
            {
                var data = new ProjectContextInitData();

                snapshot.Properties.TryGetValue(ConfigurationGeneral.LanguageServiceNameProperty, out data.LanguageName);
                snapshot.Properties.TryGetValue(ConfigurationGeneral.TargetPathProperty, out data.BinOutputPath);
                snapshot.Properties.TryGetValue(ConfigurationGeneral.MSBuildProjectFullPathProperty, out data.ProjectFilePath);

                data.ProjectGuid = projectGuid;
                data.WorkspaceProjectContextId = GetWorkspaceProjectContextId(data.ProjectFilePath, projectGuid, configuration);

                return(data);
            }
コード例 #4
0
        public async Task <IWorkspaceProjectContextAccessor?> CreateProjectContextAsync(ConfiguredProject project)
        {
            Requires.NotNull(project, nameof(project));

            ProjectContextInitData data = await GetProjectContextInitDataAsync(project);

            if (data.IsInvalid())
            {
                return(null);
            }

            object?hostObject = _project.Services.HostObject;

            IWorkspaceProjectContext?context = await CreateProjectContextHandlingFaultAsync(data, hostObject);

            if (context == null)
            {
                return(null);
            }

            return(new WorkspaceProjectContextAccessor(data.WorkspaceProjectContextId, context));
        }
コード例 #5
0
        private async Task <IWorkspaceProjectContext?> CreateProjectContextHandlingFaultAsync(ProjectContextInitData data, object?hostObject)
        {
            try
            {
                // Call into Roslyn to init language service for this project
                IWorkspaceProjectContext context = await _workspaceProjectContextFactory.Value.CreateProjectContextAsync(
                    data.LanguageName,
                    data.WorkspaceProjectContextId,
                    data.ProjectFilePath,
                    data.ProjectGuid,
                    hostObject,
                    data.BinOutputPath,
                    data.AssemblyName,
                    CancellationToken.None);

                context.LastDesignTimeBuildSucceeded = false;  // By default, turn off diagnostics until the first design time build succeeds for this project.

                return(context);
            }
            catch (Exception ex)
            {
                await _faultHandlerService.ReportFaultAsync(ex, _project, ProjectFaultSeverity.LimitedFunctionality);
            }

            return(null);
        }
コード例 #6
0
        private async Task <IWorkspaceProjectContext> CreateProjectContextHandlingFaultAsync(ProjectContextInitData data, object hostObject)
        {
            // TODO: https://github.com/dotnet/project-system/issues/353.
            await _threadingService.SwitchToUIThread();

            try
            {
                // Call into Roslyn to init language service for this project
                IWorkspaceProjectContext context = _workspaceProjectContextFactory.Value.CreateProjectContext(
                    data.LanguageName,
                    data.WorkspaceProjectContextId,
                    data.ProjectFilePath,
                    data.ProjectGuid,
                    hostObject,
                    data.BinOutputPath);

                context.LastDesignTimeBuildSucceeded = false;  // By default, turn off diagnostics until the first design time build succeeds for this project.

                return(context);
            }
            catch (Exception ex)
            {
                await _faultHandlerService.ReportFaultAsync(ex, _project, ProjectFaultSeverity.LimitedFunctionality);
            }

            return(null);
        }
        private async Task <IWorkspaceProjectContext?> CreateProjectContextHandlingFaultAsync(ProjectContextInitData data, object?hostObject)
        {
            try
            {
                // Call into Roslyn to init language service for this project
                IWorkspaceProjectContext context = await _workspaceProjectContextFactory.Value.CreateProjectContextAsync(
                    data.LanguageName,
                    data.WorkspaceProjectContextId,
                    data.ProjectFilePath,
                    data.ProjectGuid,
                    hostObject,
                    data.BinOutputPath,
                    data.AssemblyName,
                    CancellationToken.None);

                context.StartBatch();

                try
                {
                    // Update additional properties within a batch to avoid thread pool starvation.
                    // https://github.com/dotnet/project-system/issues/8027

                    context.LastDesignTimeBuildSucceeded = false;  // By default, turn off diagnostics until the first design time build succeeds for this project.

                    // Pass along any early approximation we have of the command line options
#pragma warning disable CS0618 // This was obsoleted in favor of the one that takes an array, but here just the string is easier; we'll un-Obsolete this API
                    context.SetOptions(data.CommandLineArgsForDesignTimeEvaluation);
#pragma warning restore CS0618 // Type or member is obsolete
                }
                finally
                {
                    await context.EndBatchAsync();
                }

                return(context);
            }
            catch (Exception ex)
            {
                await _faultHandlerService.ReportFaultAsync(ex, _project, ProjectFaultSeverity.LimitedFunctionality);
            }

            return(null);
        }