Compare the native-library import declarations in two compiled .NET DLLs without executing either DLL. Produces a Markdown report and JSON evidence with file hashes, metadata offsets, declaration counts and mapping flags.
Free evaluation release. This is a static declaration comparison, not a runtime compatibility or security verdict.
The native import/export checker checks declarations against an explicitly supplied native library. It requires Windows x64 and Python 3.11. Run python setup_native.py, then python demo_native.py. The default Wasmtime example correctly exits 3 because it detects a missing name. Both workflows are included in the v0.2 evaluation source ZIP.
Requires Windows x64 and Python 3.10 or newer. Python 3.11 or newer is recommended for a new installation. No preinstalled Node, npm, REA, .NET SDK, account or API key is needed.
- Download and extract the source ZIP from Releases.
- Open PowerShell in the extracted
native-import-reportdirectory. - Run:
python setup.py
python demo.pySetup installs a checksum-verified Node 24.19.0 and locked REA 6.5.0 dependencies inside this directory. It changes no global runtime. Internet is needed for setup and the first demo download. Later comparisons run locally.
The demo downloads two small, hash-pinned public SQLite provider packages, checks the real DLLs and prints the report path. Expected result: four added imports and one removed import. No private files are needed. Subsequent demo runs reuse the verified downloads.
python compare.py "C:\path\old.dll" "C:\path\new.dll" --out "C:\path\new-report"Choose a new report directory for each run. Existing output directories are refused. Open report.md for the summary. report.json retains full declarations and raw REA output is saved beside it. Reports include local input paths, so review them before sharing.
Exit 0 means the comparison completed, including when changes were found. Exit 2 means incomplete analysis or an input/output error. Incomplete coverage is never presented as a clean comparison. If setup fails, inspect .runtime/npm-install.stderr.txt and rerun python setup.py. No uninstall is needed to retry.
Matching uses exact native library and entry-point names. Duplicate declaration counts and mapping-flag distributions are preserved. A native library name change appears as removed and added imports, not proof that the underlying functions disappeared.
This tool does not verify native exports, managed signatures, ABI compatibility, actual calls or runtime loading. It cannot detect a native export disappearing when the managed declarations stay unchanged. Build-local metadata tokens are not treated as identities across versions.
| Package pair | Old/new declarations | Added/removed unique imports |
|---|---|---|
| SQLitePCLRaw.provider.e_sqlite3 2.1.11 to 3.0.3 | 149 / 152 | 4 / 1 |
| SkiaSharp 2.88.9 to 3.119.0 | 923 / 887 | 66 / 102 |
| LibGit2Sharp 0.30.0 to 0.31.0 | 369 / 371 | 353 / 353 |
| Newtonsoft.Json 13.0.1 to 13.0.3 | 0 / 0 | 0 / 0 |
Inventories are independently compared against pefix 1.0.2. LibGit2Sharp changes its native library name from git2-a418d9d to git2-3f4182d, explaining the large pair count. Targets are not executed.
Windows CI runs the checks on Python 3.11 and 3.13, including isolated ZIP installation, the public demo and offline repair. See the run results for the current status.
For development, clone the repository, run setup, then:
python test_setup.py
python test_compare.py
python verify_packages.py
python build_release.py
python verify_portable.pyTests download public fixtures and a checksum-pinned independent verifier. No sibling workspace or pre-existing cache is required. Offline tests set dead proxies and npm offline mode. They are not an OS-level network sandbox.
Please open an issue with Windows/Python versions, the command used and the outcome. Do not attach private DLLs, credentials or unreviewed reports. For usefulness feedback: did a reported change affect an upgrade decision, and how did this compare with your existing method?
Free to use for evaluation under LICENSE. This is an evaluation license, not an unrestricted open-source license. Downloaded dependencies retain their own licenses. See THIRD-PARTY.md.