示例#1
0
            /// <summary>
            /// Loads references, set options and execute files specified in the initialization file.
            /// Also prints logo unless <paramref name="isRestarting"/> is true.
            /// </summary>
            private void InitializeContext(string initializationFileOpt, bool isRestarting)
            {
                Debug.Assert(initializationFileOpt == null || PathUtilities.IsAbsolute(initializationFileOpt));

                // TODO (tomat): this is also done in CommonInteractiveEngine, perhaps we can pass the parsed command lines to here?

                if (!isRestarting)
                {
                    Console.Out.WriteLine(_repl.GetLogo());
                }

                if (File.Exists(initializationFileOpt))
                {
                    Console.Out.WriteLine(string.Format(FeaturesResources.LoadingContextFrom, Path.GetFileName(initializationFileOpt)));
                    var parser = _repl.GetCommandLineParser();

                    // 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 args = parser.Parse(new[] { "@" + initializationFileOpt }, Path.GetDirectoryName(initializationFileOpt), null /* TODO: pass a valid value*/);

                    foreach (var error in args.Errors)
                    {
                        var writer = (error.Severity == DiagnosticSeverity.Error) ? Console.Error : Console.Out;
                        writer.WriteLine(error.GetMessage(CultureInfo.CurrentCulture));
                    }

                    if (args.Errors.Length == 0)
                    {
                        // TODO (tomat): other arguments
                        // TODO (tomat): parse options

                        lock (_sessionGuard)
                        {
                            // TODO (tomat): consolidate with other reference resolving
                            foreach (CommandLineReference cmdLineReference in args.MetadataReferences)
                            {
                                // interactive command line parser doesn't accept modules or linked assemblies
                                Debug.Assert(cmdLineReference.Properties.Kind == MetadataImageKind.Assembly && !cmdLineReference.Properties.EmbedInteropTypes);

                                string fullPath = ResolveReferencePath(cmdLineReference.Reference, baseFilePath: null);
                                LoadReference(fullPath, suppressWarnings: true, addReference: true);
                            }
                        }

                        var rspDirectory = Path.GetDirectoryName(initializationFileOpt);
                        foreach (CommandLineSourceFile file in args.SourceFiles)
                        {
                            // execute all files as scripts (matches csi/vbi semantics)

                            string fullPath = ResolveRelativePath(file.Path, rspDirectory, displayPath: true);
                            if (fullPath != null)
                            {
                                ExecuteFile(fullPath);
                            }
                        }
                    }
                }

                if (!isRestarting)
                {
                    Console.Out.WriteLine(FeaturesResources.TypeHelpForMoreInformation);
                }
            }
            /// <summary>
            /// Loads references, set options and execute files specified in the initialization file.
            /// Also prints logo unless <paramref name="isRestarting"/> is true.
            /// </summary>
            private async Task <TaskResult> InitializeContextAsync(
                Task <TaskResult> lastTask,
                RemoteAsyncOperation <RemoteExecutionResult> operation,
                string initializationFileOpt,
                bool isRestarting)
            {
                Debug.Assert(initializationFileOpt == null || PathUtilities.IsAbsolute(initializationFileOpt));

                var result = await ReportUnhandledExceptionIfAny(lastTask).ConfigureAwait(false);

                try
                {
                    // TODO (tomat): this is also done in CommonInteractiveEngine, perhaps we can pass the parsed command lines to here?

                    if (!isRestarting)
                    {
                        Console.Out.WriteLine(_repl.GetLogo());
                    }

                    if (File.Exists(initializationFileOpt))
                    {
                        Console.Out.WriteLine(string.Format(FeaturesResources.LoadingContextFrom, Path.GetFileName(initializationFileOpt)));
                        var parser = _repl.GetCommandLineParser();

                        // 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 rspDirectory = Path.GetDirectoryName(initializationFileOpt);
                        var args         = parser.Parse(new[] { "@" + initializationFileOpt }, rspDirectory, RuntimeEnvironment.GetRuntimeDirectory(), null /* TODO: pass a valid value*/);

                        foreach (var error in args.Errors)
                        {
                            var writer = (error.Severity == DiagnosticSeverity.Error) ? Console.Error : Console.Out;
                            writer.WriteLine(error.GetMessage(CultureInfo.CurrentCulture));
                        }

                        if (args.Errors.Length == 0)
                        {
                            // TODO (tomat): other arguments
                            // TODO (tomat): parse options
                            var referencePaths = args.ReferencePaths;
                            result = result.With(result.Options.AddSearchPaths(referencePaths));
                            _hostObject.ReferencePaths.Clear();
                            _hostObject.ReferencePaths.AddRange(referencePaths);

                            // TODO (tomat): consolidate with other reference resolving
                            foreach (CommandLineReference cmdLineReference in args.MetadataReferences)
                            {
                                // interactive command line parser doesn't accept modules or linked assemblies
                                Debug.Assert(cmdLineReference.Properties.Kind == MetadataImageKind.Assembly && !cmdLineReference.Properties.EmbedInteropTypes);

                                var    options  = result.Options;
                                string fullPath = ResolveReferencePath(options, cmdLineReference.Reference, baseFilePath: null);
                                LoadReference(fullPath, suppressWarnings: true, addReference: true, options: ref options);
                                result = result.With(options);
                            }

                            foreach (CommandLineSourceFile file in args.SourceFiles)
                            {
                                // execute all files as scripts (matches csi/vbi semantics)

                                string fullPath = ResolveRelativePath(file.Path, rspDirectory, displayPath: true);
                                if (fullPath != null)
                                {
                                    var executeResult = await ExecuteFileAsync(result, fullPath).ConfigureAwait(false);

                                    result = executeResult.Result;
                                }
                            }
                        }
                    }

                    if (!isRestarting)
                    {
                        Console.Out.WriteLine(FeaturesResources.TypeHelpForMoreInformation);
                    }
                }
                catch (Exception e)
                {
                    ReportUnhandledException(e);
                }
                finally
                {
                    result = CompleteExecution(result, operation, true);
                }

                return(result);
            }