I had an app I wanted to run on my Raspberry Pi 3 running LibreElec. In LibreElec you can install the dotnet core 2.2 runtime as an addon, and in Visual Studio you can compile for ARM processors with ‘Target Runtime’ set to ‘linux-arm’ in the publish profile. So, I published to a folder from VS using that profile, and I copied the output over to my RPi which had the dotnet runtime installed. I did a simple dotnet Whatever.dll
to run the app (actually in this case, it was /storage/.kodi/addons/tools.dotnet-runtime/bin/dotnet Whatever.dll
because of the way the addon is installed) and was met with this error:
FailFast:
Couldn't find a valid ICU package installed on the system. Set the configuration flag System.Globalization.Invariant to true if you want to run with no globalization support.
at System.Environment.FailFast(System.String)
at System.Globalization.GlobalizationMode.GetGlobalizationInvariantMode()
at System.Globalization.GlobalizationMode..cctor()
at System.Globalization.CultureData.CreateCultureWithInvariantData()
at System.Globalization.CultureData.get_Invariant()
at System.Globalization.CultureInfo..cctor()
at System.StringComparer..cctor()
at System.AppDomain.InitializeCompatibilityFlags()
at System.AppDomain.CreateAppDomainManager()
at System.AppDomain.Setup(System.Object)
Aborted
What’s happening here is that .NET Core relies on ICU for globalization. On Linux, if the ICU binary is not present (which is the case with LibreElec), the application will fail to start. To resolve the issue you either need to install ICU on the system or turn off globalization with the runtime configuration options for globalization. Since I wasn’t interested in trying to compile ICU for LibreEelec (there are no binaries ready-to-go), I chose the latter.
Rather than set the DOTNET_SYSTEM_GLOBALIZATION_INVARIANT
environment variable, I wanted to modify the Whatever.runtimeconfig.json
file. There are two ways to do this automatically at publish-time:
-
Set an option in the project file, like this
<ItemGroup> <RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" /> </ItemGroup>
-
Add a
runtimeconfig.template.json
file with the properties you want included by default, like this{ "configProperties": { "System.Globalization.Invariant": true } }
I tested both, and ultimately selected the first method. Before enabling globalization invariant mode, my runtimeconfig.json
looked like this:
{
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true
}
}
}
Afterward, it looked like this:
{
"runtimeOptions": {
"configProperties": {
"System.Globalization.Invariant": true,
"System.GC.Server": true
}
}
}
Hat tip to this issue which is one of the top results when you Google the specific error message.
Comments