diff --git a/README.md b/README.md index 31afbac..aa951bf 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,28 @@ config.Bind(sample); If using 'snake_case' keys, YOU MUST make sure that your C# variables are 'PascalCase' to ensure proper binding. +## NativeAOT + +This library is annotated as NativeAOT compatible (`IsAotCompatible`) and has no runtime reflection dependencies. TOML parsing goes through a source-generated Tomlyn `TomlSerializerContext`, so it works when reflection-based serialization is disabled (`PublishAot=true`). + +When publishing with `PublishAot=true`, avoid reflection-based configuration binding: + +```cs +// Not AOT safe +configuration.Bind(options); + +// AOT safe +var value = configuration["Server:Port"]; +``` + +To bind values to strongly typed options under NativeAOT, opt into the configuration binder source generator: + +```xml + + true + +``` + ## Alternatives and benchmarks Another [possibly slightly faster](https://github.com/bugproof/TomlLibrariesBenchmark) alternative is [Tommy.Extensions.Configuration](https://github.com/dezhidki/Tommy/tree/master/Tommy.Extensions.Configuration). diff --git a/Tomlyn.Extensions.Configuration/TomlConfigurationFileParser.cs b/Tomlyn.Extensions.Configuration/TomlConfigurationFileParser.cs index 23f2659..e859680 100644 --- a/Tomlyn.Extensions.Configuration/TomlConfigurationFileParser.cs +++ b/Tomlyn.Extensions.Configuration/TomlConfigurationFileParser.cs @@ -20,7 +20,7 @@ public static IDictionary Parse(Stream input) private IDictionary ParseStream(Stream input) { using var reader = new StreamReader(input); - var model = TomlSerializer.Deserialize(reader.ReadToEnd()) + var model = TomlSerializer.Deserialize(reader.ReadToEnd(), TomlModelSerializerContext.Default) ?? throw new FormatException("TOML deserialization returned null"); VisitObject(model); return _data; diff --git a/Tomlyn.Extensions.Configuration/TomlModelSerializerContext.cs b/Tomlyn.Extensions.Configuration/TomlModelSerializerContext.cs new file mode 100644 index 0000000..4fdbf88 --- /dev/null +++ b/Tomlyn.Extensions.Configuration/TomlModelSerializerContext.cs @@ -0,0 +1,10 @@ +using Tomlyn.Model; +using Tomlyn.Serialization; + +namespace Tomlyn.Extensions.Configuration +{ + [TomlSerializable(typeof(TomlTable))] + internal partial class TomlModelSerializerContext : TomlSerializerContext + { + } +} diff --git a/Tomlyn.Extensions.Configuration/Tomlyn.Extensions.Configuration.csproj b/Tomlyn.Extensions.Configuration/Tomlyn.Extensions.Configuration.csproj index 3ca6822..99915a4 100644 --- a/Tomlyn.Extensions.Configuration/Tomlyn.Extensions.Configuration.csproj +++ b/Tomlyn.Extensions.Configuration/Tomlyn.Extensions.Configuration.csproj @@ -11,11 +11,12 @@ MIT true default + true - +