public async Task <IHost> InitAsync( List <Assembly> openModHostAssemblies, RuntimeInitParameters parameters, Func <IHostBuilder> hostBuilderFunc = null) { try { var openModCoreAssembly = typeof(AsyncHelper).Assembly; if (!openModHostAssemblies.Contains(openModCoreAssembly)) { openModHostAssemblies.Insert(0, openModCoreAssembly); } Type hostInformationType = openModHostAssemblies .Select(asm => asm.GetLoadableTypes().FirstOrDefault(t => typeof(IHostInformation).IsAssignableFrom(t))) .LastOrDefault(d => d != null); if (hostInformationType == null) { throw new Exception("Failed to find IHostInformation in host assemblies."); } HostInformation = (IHostInformation)Activator.CreateInstance(hostInformationType); m_OpenModHostAssemblies = openModHostAssemblies; m_HostBuilderFunc = hostBuilderFunc; m_RuntimeInitParameters = parameters; var hostBuilder = hostBuilderFunc == null ? new HostBuilder() : hostBuilderFunc(); if (!Directory.Exists(parameters.WorkingDirectory)) { Directory.CreateDirectory(parameters.WorkingDirectory); } Status = RuntimeStatus.Initializing; WorkingDirectory = parameters.WorkingDirectory; CommandlineArgs = parameters.CommandlineArgs; SetupSerilog(); m_Logger.LogInformation($"OpenMod v{Version} is starting..."); var packagesDirectory = Path.Combine(WorkingDirectory, "packages"); var nuGetPackageManager = parameters.PackageManager as NuGetPackageManager ?? new NuGetPackageManager(packagesDirectory); // nuGetPackageManager.ClearCache(); nuGetPackageManager.Logger = new OpenModNuGetLogger(m_LoggerFactory.CreateLogger("NuGet")); await nuGetPackageManager.RemoveOutdatedPackagesAsync(); nuGetPackageManager.InstallAssemblyResolver(); nuGetPackageManager.SetAssemblyLoader(Hotloader.LoadAssembly); var startupContext = new OpenModStartupContext { Runtime = this, LoggerFactory = m_LoggerFactory, NuGetPackageManager = nuGetPackageManager, DataStore = new Dictionary <string, object>() }; var startup = new OpenModStartup(startupContext); startupContext.OpenModStartup = startup; foreach (var assembly in openModHostAssemblies) { startup.RegisterIocAssemblyAndCopyResources(assembly, string.Empty); } await startup.LoadPluginAssembliesAsync(); hostBuilder .UseContentRoot(parameters.WorkingDirectory) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureHostConfiguration(builder => { ConfigureConfiguration(builder, startup); ((OpenModStartupContext)startup.Context).Configuration = builder.Build(); }) .ConfigureAppConfiguration(builder => ConfigureConfiguration(builder, startup)) .ConfigureContainer <ContainerBuilder>(builder => SetupContainer(builder, startup)) .ConfigureServices(services => SetupServices(services, startup)) .UseSerilog(); Host = hostBuilder.Build(); m_AppLifeTime = Host.Services.GetRequiredService <IHostApplicationLifetime>(); m_AppLifeTime.ApplicationStopping.Register(() => { AsyncHelper.RunSync(ShutdownAsync); }); Status = RuntimeStatus.Initialized; LifetimeScope = Host.Services.GetRequiredService <ILifetimeScope>().BeginLifetimeScope( containerBuilder => { containerBuilder.Register(ctx => this) .As <IOpenModComponent>() .SingleInstance() .ExternallyOwned(); containerBuilder.RegisterType <ScopedPermissionChecker>() .As <IPermissionChecker>() .InstancePerLifetimeScope() .OwnedByLifetimeScope(); }); DataStore = Host.Services.GetRequiredService <IDataStoreFactory>().CreateDataStore( new DataStoreCreationParameters { ComponentId = OpenModComponentId, Prefix = "openmod", Suffix = null, WorkingDirectory = WorkingDirectory }); var eventBus = Host.Services.GetRequiredService <IEventBus>(); foreach (var assembly in openModHostAssemblies) { eventBus.Subscribe(this, assembly); } try { await Host.StartAsync(); } catch (Exception ex) { Status = RuntimeStatus.Crashed; m_Logger.LogCritical(ex, "OpenMod has crashed."); Log.CloseAndFlush(); } return(Host); } catch (Exception ex) { Console.WriteLine(ex); throw; } }
public async Task <IHost> InitAsync( List <Assembly> openModHostAssemblies, RuntimeInitParameters parameters, Func <IHostBuilder> hostBuilderFunc = null) { var openModCoreAssembly = typeof(AsyncHelper).Assembly; if (!openModHostAssemblies.Contains(openModCoreAssembly)) { openModHostAssemblies.Insert(0, openModCoreAssembly); } m_OpenModHostAssemblies = openModHostAssemblies; m_HostBuilderFunc = hostBuilderFunc; m_RuntimeInitParameters = parameters; var hostBuilder = hostBuilderFunc == null ? new HostBuilder() : hostBuilderFunc(); if (!Directory.Exists(parameters.WorkingDirectory)) { Directory.CreateDirectory(parameters.WorkingDirectory); } Status = RuntimeStatus.Initializing; WorkingDirectory = parameters.WorkingDirectory; CommandlineArgs = parameters.CommandlineArgs; SetupSerilog(); m_Logger.LogInformation($"OpenMod v{Version} is starting..."); var packagesDirectory = Path.Combine(WorkingDirectory, "packages"); var nuGetPackageManager = new NuGetPackageManager(packagesDirectory) { Logger = new OpenModNuGetLogger(m_LoggerFactory.CreateLogger <OpenModNuGetLogger>()) }; nuGetPackageManager.InstallAssemblyResolver(); var startupContext = new OpenModStartupContext { Runtime = this, LoggerFactory = m_LoggerFactory, NuGetPackageManager = nuGetPackageManager, DataStore = new Dictionary <string, object>() }; var startup = new OpenModStartup(startupContext); foreach (var assembly in openModHostAssemblies) { startup.RegisterIocAssemblyAndCopyResources(assembly, string.Empty); } await startup.LoadPluginAssembliesAsync(); hostBuilder .UseContentRoot(parameters.WorkingDirectory) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureHostConfiguration(builder => { ConfigureConfiguration(builder, startup); ((OpenModStartupContext)startup.Context).Configuration = builder.Build(); }) .ConfigureAppConfiguration(builder => ConfigureConfiguration(builder, startup)) .ConfigureContainer <ContainerBuilder>(builder => SetupContainer(builder, startup)) .ConfigureServices(services => SetupServices(services, startup)) .UseSerilog(); m_Host = hostBuilder.Build(); m_AppLifeTime = m_Host.Services.GetRequiredService <IHostApplicationLifetime>(); m_AppLifeTime.ApplicationStopping.Register(() => { AsyncHelper.RunSync(ShutdownAsync); }); Status = RuntimeStatus.Initialized; LifetimeScope = m_Host.Services.GetRequiredService <ILifetimeScope>(); DataStore = m_Host.Services.GetRequiredService <IDataStoreFactory>().CreateDataStore("openmod", WorkingDirectory); var eventBus = m_Host.Services.GetRequiredService <IEventBus>(); foreach (var assembly in openModHostAssemblies) { eventBus.Subscribe(this, assembly); } try { await m_Host.StartAsync(); } catch (Exception ex) { Status = RuntimeStatus.Crashed; m_Logger.LogCritical(ex, "OpenMod has crashed."); Log.CloseAndFlush(); } return(m_Host); }