MLVScan.DevCLI
1.3.1
dotnet tool install --global MLVScan.DevCLI --version 1.3.1
dotnet new tool-manifest
dotnet tool install --local MLVScan.DevCLI --version 1.3.1
#tool dotnet:?package=MLVScan.DevCLI&version=1.3.1
nuke :add-package MLVScan.DevCLI --version 1.3.1
MLVScan.DevCLI
Scan .NET mod assemblies from the command line or during a build. MLVScan reports suspicious behavior, known malware families, and guidance for reviewing findings.
Install
.NET tool
Install the CLI globally:
dotnet tool install --global MLVScan.DevCLI
To update it:
dotnet tool update --global MLVScan.DevCLI
For a project-local installation, create a tool manifest if your project does not already have one, then install the tool:
dotnet new tool-manifest
dotnet tool install MLVScan.DevCLI
Run a local installation with dotnet tool run mlvscan -- followed by the scan
arguments. Use dotnet tool restore after cloning a project with a tool manifest.
Windows executable
Download mlvscan-win-x64.zip from GitHub Releases,
extract it, and run mlvscan.exe from the extracted folder:
.\mlvscan.exe info --format json
Scan an assembly
mlvscan MyMod.dll
The console report shows the overall disposition, findings, and any matched threat families. Findings may include remediation advice, documentation links, call chains, or data-flow evidence.
Start with the disposition and Blocking Recommended value. Findings are supporting
evidence; neither a sensitive API nor its raw severity means the implementation must
be rewritten. Suspicious with blockingRecommended: false requests review without
recommending a block. Verified restart flows can receive this advisory result while
their process-execution findings remain visible.
Developer guidance offers optional APIs or workflows when they preserve the required behavior. Check target-runtime support. For example, a direct executable launch is not a drop-in replacement for a Steam URI or a helper that waits for shutdown. Native interop, encoding, file I/O, and dynamic loading can all be legitimate. If the behavior is necessary and misclassified, share the schema report, scanner version, and relevant source with the maintainer so detection can improve. Do not rewrite code solely to silence a rule. Review reports for private paths or URLs before sharing them.
Use --verbose to include advanced diagnostics:
mlvscan MyMod.dll --verbose
JSON output
Use the schema format for scripts and CI:
mlvscan MyMod.dll --format schema > scan-results.json
The report includes disposition, threatFamilies, findings, and scan metadata.
The legacy JSON format remains available with --format json or --json.
Deeper analysis
If a scan reaches an analysis limit, use retry to run deeper analysis when needed:
mlvscan MyMod.dll --scan-mode retry --format schema
Use --scan-mode deep to apply the larger analysis budgets from the start. These include process value recovery work, depth, and alternative limits. When recovery reaches a limit, the console shows a retry hint and --verbose / schema output includes the ValueResolutionBudget diagnostic. Recovered candidates remain available to detection; unresolved values are not treated as safe. Deep mode is still finite and cannot recover every runtime value.
Deeper scans can take longer and may still need manual review if an analysis
limit is reached.
Use in a build
To fail a build when the disposition is Suspicious or KnownThreat:
mlvscan MyMod.dll --fail-on-disposition Suspicious
The command returns exit code 1 when the threshold is met. Without a failure
threshold, a completed scan returns 0 even if it reports findings. Scan errors
also return 1.
This classification threshold also fails for advisory Suspicious results, even when
blockingRecommended is false. It is intentionally stricter than the loader's
blocking recommendation. Automation that follows that recommendation should consume
disposition.blockingRecommended from --format schema instead. Exit semantics have
not changed.
For workflows that use finding severity, --fail-on High fails on High or
Critical findings.
MSBuild
Install MLVScan as a local tool in your project, then add this target to your
.csproj:
<Target Name="MLVScanCheck" AfterTargets="Build">
<Exec Command="dotnet tool run mlvscan -- "$(TargetPath)" --fail-on-disposition Suspicious" />
</Target>
Run dotnet tool restore before building on a new machine or in CI.
GitHub Actions
This example builds a project and scans its assembly. Replace MyMod.csproj and
the DLL path with your project's paths.
name: Build and scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-dotnet@v5
with:
dotnet-version: '8.0.x'
- name: Install MLVScan
run: dotnet tool install --global MLVScan.DevCLI
- name: Build
run: dotnet build MyMod.csproj -c Release
- name: Scan
run: mlvscan ./bin/Release/netstandard2.1/MyMod.dll --format schema --fail-on-disposition Suspicious > scan-results.json
- name: Save report
if: always()
uses: actions/upload-artifact@v6
with:
name: scan-results
path: scan-results.json
Command reference
mlvscan <assembly-path> [options]
mlvscan info [--format text|json]
mlvscan --schema-version
| Option | Behavior |
|---|---|
--format, -o |
Output console (default), schema, or legacy json. |
--json, -j |
Use legacy JSON output. |
--fail-on-disposition |
Return 1 at or above Clean, Suspicious, or KnownThreat. |
--fail-on, -f |
Return 1 at or above Low, Medium, High, or Critical severity. |
--verbose, -v |
Include advanced diagnostics. |
--scan-mode |
Use standard (default), retry, or deep analysis. |
--help, -h |
Show command help. |
--version |
Show the CLI version. |
Review a result
Start with the disposition and any threat-family matches, then read the supporting findings. Severity describes individual findings; it is not the overall verdict. Review incomplete analysis and uncertain findings before deciding what to do with an assembly.
The CLI scans compiled assemblies, so source code is not required. If you suspect a false positive, report it with the scan output and enough context to explain the assembly's intended behavior.
Support
License
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.3.1 | 4 | 10/28/2026 |
| 1.3.0 | 471 | 10/2/2026 |
| 1.2.11 | 413 | 8/28/2026 |
| 1.2.10 | 238 | 6/20/2026 |
| 1.2.9 | 150 | 6/13/2026 |
| 1.2.8 | 165 | 6/1/2026 |
| 1.2.7 | 157 | 5/18/2026 |
| 1.2.6 | 168 | 5/5/2026 |
| 1.2.5 | 255 | 4/17/2026 |
| 1.2.4 | 151 | 4/4/2026 |
| 1.2.3 | 136 | 4/3/2026 |
| 1.2.0 | 159 | 3/21/2026 |
| 1.1.1 | 138 | 3/13/2026 |
| 1.0.3 | 142 | 2/16/2026 |
| 1.0.1 | 155 | 1/4/2026 |
| 1.0.0 | 140 | 1/4/2026 |