diff --git a/src/BlazorWorker.WorkerCore/BlazorWorker.WorkerCore.xml b/src/BlazorWorker.WorkerCore/BlazorWorker.WorkerCore.xml index a090ef7..6a995f4 100644 --- a/src/BlazorWorker.WorkerCore/BlazorWorker.WorkerCore.xml +++ b/src/BlazorWorker.WorkerCore/BlazorWorker.WorkerCore.xml @@ -76,6 +76,15 @@ Mono-wasm-annotated endpoint for doing callbacks on self invocations from the worker. Experts only. + + + Sets environment variables in the target worker. + + + Defaults to a single entry: DOTNET_SYSTEM_GLOBALIZATION_INVARIANT = '1'. + For more information see https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-environment-variables + + Contains convenience extensions for @@ -119,5 +128,17 @@ When this method has been called, can be used inside the service either by instanciating it or by injection into the constructor. + + + Set the specified to the specified when the worker runtime has been initialized + + + + + + + For more information see https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-environment-variables + + diff --git a/src/BlazorWorker.WorkerCore/InitOptions.cs b/src/BlazorWorker.WorkerCore/InitOptions.cs index 919d922..b5b8419 100644 --- a/src/BlazorWorker.WorkerCore/InitOptions.cs +++ b/src/BlazorWorker.WorkerCore/InitOptions.cs @@ -74,9 +74,28 @@ public WorkerInitOptions() /// public string EndInvokeCallBackEndpoint { get; set; } + /// + /// Sets environment variables in the target worker. + /// + /// + /// Defaults to a single entry: DOTNET_SYSTEM_GLOBALIZATION_INVARIANT = '1'. + /// For more information see https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-environment-variables + /// + public Dictionary EnvMap { get; set; } + = new Dictionary() { + { "DOTNET_SYSTEM_GLOBALIZATION_INVARIANT", "1" }, + }; + public WorkerInitOptions MergeWith(WorkerInitOptions initOptions) { - + var newEnvMap = new Dictionary(this.EnvMap); + if (initOptions.EnvMap != null) + { + foreach (var entry in initOptions.EnvMap) + { + newEnvMap[entry.Key] = entry.Value; + } + } return new WorkerInitOptions { CallbackMethod = initOptions.CallbackMethod ?? this.CallbackMethod, @@ -87,7 +106,8 @@ public WorkerInitOptions MergeWith(WorkerInitOptions initOptions) UseConventionalServiceAssembly = initOptions.UseConventionalServiceAssembly, MessageEndPoint = initOptions.MessageEndPoint ?? this.MessageEndPoint, InitEndPoint = initOptions.InitEndPoint ?? this.InitEndPoint, - EndInvokeCallBackEndpoint = initOptions.EndInvokeCallBackEndpoint ?? this.EndInvokeCallBackEndpoint + EndInvokeCallBackEndpoint = initOptions.EndInvokeCallBackEndpoint ?? this.EndInvokeCallBackEndpoint, + EnvMap = newEnvMap }; } } @@ -156,7 +176,7 @@ public static WorkerInitOptions AddHttpClient(this WorkerInitOptions source) source.AddAssemblies("System.Net.Http.dll", "System.Net.Http.WebAssemblyHttpHandler.dll"); #endif -#if NET5 +#if NET5_0_OR_GREATER source.AddAssemblies( "System.Net.Http.dll", "System.Security.Cryptography.X509Certificates.dll", @@ -169,5 +189,21 @@ public static WorkerInitOptions AddHttpClient(this WorkerInitOptions source) return source; } + + /// + /// Set the specified to the specified when the worker runtime has been initialized + /// + /// + /// + /// + /// + /// + /// For more information see https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-environment-variables + /// + public static WorkerInitOptions SetEnv(this WorkerInitOptions source, string environmentVariableName, string value) + { + source.EnvMap[environmentVariableName] = value; + return source; + } } } \ No newline at end of file diff --git a/src/BlazorWorker.WorkerCore/SimpleInstanceService/SimpleInstanceService.cs b/src/BlazorWorker.WorkerCore/SimpleInstanceService/SimpleInstanceService.cs index c9d53dd..bfc0e6e 100644 --- a/src/BlazorWorker.WorkerCore/SimpleInstanceService/SimpleInstanceService.cs +++ b/src/BlazorWorker.WorkerCore/SimpleInstanceService/SimpleInstanceService.cs @@ -231,7 +231,7 @@ private static InitInstanceResult InitInstance(long callId, string typeName, str private static Assembly LogFailedAssemblyResolve(object sender, ResolveEventArgs args) { - Console.Error.WriteLine($"{typeof(SimpleInstanceService).FullName}: '{args.RequestingAssembly}' is requesting missing assembly '{args.Name}')"); + Console.Error.WriteLine($"{typeof(SimpleInstanceService).FullName}: '{args.RequestingAssembly}' is requesting missing assembly '{args.Name}'). See https://github.com/Tewr/BlazorWorker#setup-dependencies for common solutions to this problem."); //return null; // Nobody really cares about this exception for now, it can't be caught. diff --git a/src/BlazorWorker/BlazorWorker.js b/src/BlazorWorker/BlazorWorker.js index 369c7c1..cc8e7fc 100644 --- a/src/BlazorWorker/BlazorWorker.js +++ b/src/BlazorWorker/BlazorWorker.js @@ -92,8 +92,15 @@ window.BlazorWorker = function () { default: return fileName; } }; - module.onRuntimeInitialized = () => - MONO.mono_wasm_setenv('DOTNET_SYSTEM_GLOBALIZATION_INVARIANT', '1'); + module.onRuntimeInitialized = () => { + const envMap = initConf.envMap; + for (const key in envMap) { + if (Object.prototype.hasOwnProperty.call(envMap, key)) { + MONO.mono_wasm_setenv(key, envMap[key]); + } + } + } + module.preRun.push(() => { const mono_wasm_add_assembly = Module.cwrap('mono_wasm_add_assembly', null, [ 'string', @@ -269,6 +276,7 @@ window.BlazorWorker = function () { endInvokeCallBackEndpoint: initOptions.endInvokeCallBackEndpoint, wasmRoot: initOptions.wasmRoot, blazorBoot: "_framework/blazor.boot.json", + envMap: initOptions.envMap, debug: initOptions.debug };