Thanks for considering a contribution. This project takes small, focused pull requests over large rewrites — see ARCHITECTURE.md for the shape of the codebase before diving in, and STYLEGUIDE.md for the code style, which the analyzers only partly enforce.
-
Warnings are errors.
Directory.Build.propssetsTreatWarningsAsErrors, with a curatedAnalysisMode=Allanalyzer set (Sonar, Meziantou, Roslynator, AsyncFixer, and more). A PR that doesn't build clean locally won't build clean in CI either — run a full build before pushing:dotnet build ExcelReader.slnx --configuration Release
-
Public API changes require a
PublicAPI.Unshipped.txtentry.Microsoft.CodeAnalysis.PublicApiAnalyzersis active (arrives transitively viaRoslyn.Diagnostics.Analyzers) and fails the build on any unrecorded public member. If you add, change, or remove anything public, update bothsrc/ExcelReader.Core/PublicAPI/net8.0/PublicAPI.Unshipped.txtandsrc/ExcelReader.Core/PublicAPI/net10.0/PublicAPI.Unshipped.txt. A bot promotesUnshipped→Shippedautomatically after each release — don't editShipped.txtby hand. -
Tests are required for behavior changes. Run the suite before opening a PR:
dotnet test tests/ExcelReader.Tests/ExcelReader.Tests.csproj --configuration ReleaseUntrusted-input paths (the CFB/OLE, BIFF8, BIFF12, and ZIP parsers) get extra scrutiny — new parsing code should have a corresponding limit/fuzz-safety test in
tests/ExcelReader.Tests/ReaderLimitTests.csorFuzzTests.cswhere relevant. Read STYLEGUIDE.md § Untrusted Input before touching a parser: every length, offset, and size read from the file must be bounded before it drives an allocation.
- One focused change per PR — don't batch unrelated fixes into one commit or one PR.
- If a change is user-visible (new API, behavior change, performance claim), mention it in the PR description; the README's benchmark tables and changelog are updated separately, not as part of every PR.
- CI runs on Linux, Windows, and macOS across .NET 8 and .NET 10 — a change that only builds on one OS/TFM combination isn't ready to merge.
Use GitHub Issues for bugs and feature requests. For suspected security vulnerabilities, do not open a public issue — see SECURITY.md for the private reporting channel.
This project follows the Code of Conduct.