public Task<int> Main(string[] args) { DefaultHostOptions options; string[] programArgs; int exitCode; bool shouldExit = ParseArgs(args, out options, out programArgs, out exitCode); if (shouldExit) { return Task.FromResult(exitCode); } var host = new DefaultHost(options, _serviceProvider); if (host.Project == null) { return Task.FromResult(-1); } var lookupCommand = string.IsNullOrEmpty(options.ApplicationName) ? "run" : options.ApplicationName; string replacementCommand; if (host.Project.Commands.TryGetValue(lookupCommand, out replacementCommand)) { var replacementArgs = CommandGrammar.Process( replacementCommand, GetVariable).ToArray(); options.ApplicationName = replacementArgs.First(); programArgs = replacementArgs.Skip(1).Concat(programArgs).ToArray(); } if (string.IsNullOrEmpty(options.ApplicationName) || string.Equals(options.ApplicationName, "run", StringComparison.Ordinal)) { options.ApplicationName = host.Project.EntryPoint ?? host.Project.Name; } IDisposable disposable = null; try { disposable = host.AddLoaders(_container); return ExecuteMain(host, options.ApplicationName, programArgs) .ContinueWith(async (t, state) => { ((IDisposable)state).Dispose(); return await t; }, disposable).Unwrap(); } catch { // If there's an error, dispose the host and throw if (disposable != null) { disposable.Dispose(); } throw; } }
private Task<int> ExecuteMain(DefaultHost host, string applicationName, string[] args) { Assembly assembly = null; try { assembly = host.GetEntryPoint(applicationName); } catch (FileNotFoundException ex) when (new AssemblyName(ex.FileName).Name == applicationName) { if (ex.InnerException is ICompilationException) { throw ex.InnerException; } ThrowEntryPointNotfoundException( host, applicationName, ex.InnerException); } if (assembly == null) { return Task.FromResult(-1); } return EntryPointExecutor.Execute(assembly, args, host.ServiceProvider); }
private Task<int> ExecuteMain(DefaultHost host, string applicationName, string[] args) { Assembly assembly = null; try { assembly = host.GetEntryPoint(applicationName); } catch (FileLoadException ex) { // FileName is always turned into an assembly name if (new AssemblyName(ex.FileName).Name == applicationName) { ThrowEntryPointNotfoundException( host, applicationName, ex.InnerException); } else { throw; } } catch (FileNotFoundException ex) { if (ex.FileName == applicationName) { ThrowEntryPointNotfoundException( host, applicationName, ex.InnerException); } else { throw; } } if (assembly == null) { return Task.FromResult(-1); } return EntryPointExecutor.Execute(assembly, args, host.ServiceProvider); }
private static void ThrowEntryPointNotfoundException( DefaultHost host, string applicationName, Exception innerException) { if (host.Project.Commands.Any()) { // Throw a nicer exception message if the command // can't be found throw new InvalidOperationException( string.Format("Unable to load application or execute command '{0}'. Available commands: {1}.", applicationName, string.Join(", ", host.Project.Commands.Keys)), innerException); } throw new InvalidOperationException( string.Format("Unable to load application or execute command '{0}'.", applicationName), innerException); }
private static void ThrowEntryPointNotfoundException( DefaultHost host, string applicationName, Exception innerException) { var compilationException = innerException as CompilationException; if (compilationException != null) { throw new InvalidOperationException( string.Join(Environment.NewLine, compilationException.Errors)); } #if K10 // HACK: Don't show inner exceptions for non compilation errors. // There's a bug in the CoreCLR loader, where it throws another // invalid operation exception for any load failure with a bizzare // message. innerException = null; #endif if (host.Project.Commands.Any()) { // Throw a nicer exception message if the command // can't be found throw new InvalidOperationException( string.Format("Unable to load application or execute command '{0}'. Available commands: {1}.", applicationName, string.Join(", ", host.Project.Commands.Keys)), innerException); } throw new InvalidOperationException( string.Format("Unable to load application or execute command '{0}'.", applicationName), innerException); }