/// <summary> /// Invoked by <see cref="InteractiveHost"/> when a new process is being started. /// </summary> private void ProcessStarting(bool initialize) { var textView = GetCurrentWindowOrThrow().TextView; var dispatcher = ((FrameworkElement)textView).Dispatcher; if (!dispatcher.CheckAccess()) { dispatcher.BeginInvoke(new Action(() => ProcessStarting(initialize))); return; } // Freeze all existing classifications and then clear the list of submission buffers we have. _submissionBuffers.Remove(_currentSubmissionBuffer); // if present foreach (var textBuffer in _submissionBuffers) { InertClassifierProvider.CaptureExistingClassificationSpans(_classifierAggregator, textView, textBuffer); } _submissionBuffers.Clear(); // We always start out empty _workspace.ClearSolution(); _currentSubmissionProjectId = null; _previousSubmissionProjectId = null; var metadataService = _workspace.CurrentSolution.Services.MetadataService; var mscorlibRef = metadataService.GetReference(typeof(object).Assembly.Location, MetadataReferenceProperties.Assembly); var interactiveHostObjectRef = metadataService.GetReference(typeof(InteractiveScriptGlobals).Assembly.Location, Script.HostAssemblyReferenceProperties); _responseFileReferences = ImmutableArray.Create <MetadataReference>(mscorlibRef, interactiveHostObjectRef); _responseFileImports = ImmutableArray <string> .Empty; _initialScriptFileOpt = null; ReferenceSearchPaths = ImmutableArray <string> .Empty; SourceSearchPaths = ImmutableArray <string> .Empty; if (initialize && File.Exists(_responseFilePath)) { // The base directory for relative paths is the directory that contains the .rsp file. // Note that .rsp files included by this .rsp file will share the base directory (Dev10 behavior of csc/vbc). var responseFileDirectory = Path.GetDirectoryName(_responseFilePath); var args = this.CommandLineParser.Parse(new[] { "@" + _responseFilePath }, responseFileDirectory, RuntimeEnvironment.GetRuntimeDirectory(), null); if (args.Errors.Length == 0) { var metadataResolver = CreateMetadataReferenceResolver(metadataService, args.ReferencePaths, responseFileDirectory); var sourceResolver = CreateSourceReferenceResolver(args.SourcePaths, responseFileDirectory); // ignore unresolved references, they will be reported in the interactive window: var responseFileReferences = args.ResolveMetadataReferences(metadataResolver).Where(r => !(r is UnresolvedMetadataReference)); _initialScriptFileOpt = args.SourceFiles.IsEmpty ? null : args.SourceFiles[0].Path; ReferenceSearchPaths = args.ReferencePaths; SourceSearchPaths = args.SourcePaths; _responseFileReferences = _responseFileReferences.AddRange(responseFileReferences); _responseFileImports = CommandLineHelpers.GetImports(args); } } _metadataReferenceResolver = CreateMetadataReferenceResolver(metadataService, ReferenceSearchPaths, _initialWorkingDirectory); _sourceReferenceResolver = CreateSourceReferenceResolver(SourceSearchPaths, _initialWorkingDirectory); // create the first submission project in the workspace after reset: if (_currentSubmissionBuffer != null) { AddSubmission(_currentSubmissionBuffer, this.LanguageName); } }
/// <summary> /// Invoked by <see cref="InteractiveHost"/> when a new process is being started. /// </summary> private void ProcessStarting(InteractiveHostOptions options) { if (!Dispatcher.CheckAccess()) { Dispatcher.BeginInvoke(new Action(() => ProcessStarting(options))); return; } // Freeze all existing classifications and then clear the list of // submission buffers we have. FreezeClassifications(); _submissionBuffers.Clear(); // We always start out empty _workspace.ClearSolution(); _currentSubmissionProjectId = null; _previousSubmissionProjectId = null; var metadataService = _workspace.CurrentSolution.Services.MetadataService; ImmutableArray <string> referencePaths; // reset configuration: if (File.Exists(_responseFilePath)) { // The base directory for relative paths is the directory that contains the .rsp file. // Note that .rsp files included by this .rsp file will share the base directory (Dev10 behavior of csc/vbc). var rspArguments = this.CommandLineParser.Parse(new[] { "@" + _responseFilePath }, Path.GetDirectoryName(_responseFilePath), null /* TODO: pass a valid value*/); referencePaths = rspArguments.ReferencePaths; // the base directory for references specified in the .rsp file is the .rsp file directory: var rspMetadataReferenceResolver = new GacFileResolver( referencePaths, baseDirectory: rspArguments.BaseDirectory, architectures: GacFileResolver.Default.Architectures, // TODO (tomat) preferredCulture: System.Globalization.CultureInfo.CurrentCulture); // TODO (tomat) var metadataProvider = metadataService.GetProvider(); // ignore unresolved references, they will be reported in the interactive window: var rspReferences = rspArguments.ResolveMetadataReferences(new AssemblyReferenceResolver(rspMetadataReferenceResolver, metadataProvider)) .Where(r => !(r is UnresolvedMetadataReference)); var interactiveHelpersRef = metadataService.GetReference(typeof(Script).Assembly.Location, MetadataReferenceProperties.Assembly); var interactiveHostObjectRef = metadataService.GetReference(typeof(InteractiveHostObject).Assembly.Location, MetadataReferenceProperties.Assembly); _references = ImmutableHashSet.Create <MetadataReference>( interactiveHelpersRef, interactiveHostObjectRef) .Union(rspReferences); // we need to create projects for these: _rspSourceFiles = rspArguments.SourceFiles; } else { var mscorlibRef = metadataService.GetReference(typeof(object).Assembly.Location, MetadataReferenceProperties.Assembly); _references = ImmutableHashSet.Create <MetadataReference>(mscorlibRef); _rspSourceFiles = ImmutableArray.Create <CommandLineSourceFile>(); referencePaths = ScriptOptions.Default.SearchPaths; } // reset search paths, working directory: _metadataReferenceResolver = new GacFileResolver( referencePaths, baseDirectory: _initialWorkingDirectory, architectures: GacFileResolver.Default.Architectures, // TODO (tomat) preferredCulture: System.Globalization.CultureInfo.CurrentCulture); // TODO (tomat) _sourceSearchPaths = InteractiveHost.Service.DefaultSourceSearchPaths; // create the first submission project in the workspace after reset: if (_currentSubmissionBuffer != null) { AddSubmission(_currentTextView, _currentSubmissionBuffer); } }
/// <summary> /// Invoked by <see cref="InteractiveHost"/> when a new process is being started. /// </summary> private void ProcessStarting(bool initialize) { if (!Dispatcher.CheckAccess()) { Dispatcher.BeginInvoke(new Action(() => ProcessStarting(initialize))); return; } // Freeze all existing classifications and then clear the list of // submission buffers we have. FreezeClassifications(); _submissionBuffers.Clear(); // We always start out empty _workspace.ClearSolution(); _currentSubmissionProjectId = null; _previousSubmissionProjectId = null; var metadataService = _workspace.CurrentSolution.Services.MetadataService; ReferenceSearchPaths = ImmutableArray.Create(FileUtilities.NormalizeDirectoryPath(RuntimeEnvironment.GetRuntimeDirectory())); SourceSearchPaths = ImmutableArray.Create(FileUtilities.NormalizeDirectoryPath(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile))); if (initialize && File.Exists(_responseFilePath)) { // The base directory for relative paths is the directory that contains the .rsp file. // Note that .rsp files included by this .rsp file will share the base directory (Dev10 behavior of csc/vbc). var rspArguments = this.CommandLineParser.Parse(new[] { "@" + _responseFilePath }, Path.GetDirectoryName(_responseFilePath), RuntimeEnvironment.GetRuntimeDirectory(), null /* TODO: pass a valid value*/); ReferenceSearchPaths = ReferenceSearchPaths.AddRange(rspArguments.ReferencePaths); // the base directory for references specified in the .rsp file is the .rsp file directory: var rspMetadataReferenceResolver = CreateMetadataReferenceResolver(metadataService, ReferenceSearchPaths, rspArguments.BaseDirectory); // ignore unresolved references, they will be reported in the interactive window: var rspReferences = rspArguments.ResolveMetadataReferences(rspMetadataReferenceResolver) .Where(r => !(r is UnresolvedMetadataReference)); var interactiveHelpersRef = metadataService.GetReference(typeof(Script).Assembly.Location, MetadataReferenceProperties.Assembly); var interactiveHostObjectRef = metadataService.GetReference(typeof(InteractiveHostObject).Assembly.Location, MetadataReferenceProperties.Assembly); _references = ImmutableHashSet.Create <MetadataReference>( interactiveHelpersRef, interactiveHostObjectRef) .Union(rspReferences); // we need to create projects for these: _rspSourceFiles = rspArguments.SourceFiles; } else { var mscorlibRef = metadataService.GetReference(typeof(object).Assembly.Location, MetadataReferenceProperties.Assembly); _references = ImmutableHashSet.Create <MetadataReference>(mscorlibRef); _rspSourceFiles = ImmutableArray.Create <CommandLineSourceFile>(); } _metadataReferenceResolver = CreateMetadataReferenceResolver(metadataService, ReferenceSearchPaths, _initialWorkingDirectory); _sourceReferenceResolver = CreateSourceReferenceResolver(SourceSearchPaths, _initialWorkingDirectory); // create the first submission project in the workspace after reset: if (_currentSubmissionBuffer != null) { AddSubmission(_currentTextView, _currentSubmissionBuffer, this.LanguageName); } }