S1Interop 0.1.0-alpha.1

This is a prerelease version of S1Interop.
dotnet tool install --global S1Interop --version 0.1.0-alpha.1
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local S1Interop --version 0.1.0-alpha.1
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=S1Interop&version=0.1.0-alpha.1&prerelease
                    
nuke :add-package S1Interop --version 0.1.0-alpha.1
                    

S1Interop

S1Interop helps Schedule I mod developers catch Mono/IL2CPP problems earlier and change projects more safely.

Licensed under GPL-3.0-only.

Its dependable early value is:

  • compile-time diagnostics for known IL2CPP boundary problems;
  • read-only project and source analysis;
  • explainable migration plans with dry-run defaults;
  • rollbackable, narrow source and project transformations;
  • disposable sandbox verification and explicit Mono/IL2CPP build targets.

Backend-neutral generated facades are available as an experimental opt-in. They are still fragile and are not the default scaffold or the primary product promise. Keep a dual-runtime fallback until a mod has sustained real-world validation on both game branches.

Choose a path

New to modding — build your first mod

Create the recommended dual-runtime starter:

s1interop new .\MyFirstMod
s1interop new .\MyFirstMod --apply
Set-Location .\MyFirstMod

The first command previews every file. The second creates the project only when the target directory is empty.

Detect and validate local prerequisites:

s1interop doctor .
s1interop setup .
s1interop setup . --apply

doctor is read-only. setup is also a dry run unless --apply is present. It writes only an ignored local.build.props, never installs software, never edits the project, and never overwrites existing local configuration.

Build the branch you have installed:

dotnet build .\MyFirstMod.sln -c "Debug Mono"
dotnet build .\MyFirstMod.sln -c "Debug Il2Cpp"

The matching DLL is written under:

bin\Mono\Debug Mono\netstandard2.1\MyFirstMod.dll
bin\Il2Cpp\Debug Il2Cpp\net6.0\MyFirstMod.dll

Copy the matching DLL to that game install's Mods folder. A successful launch logs:

MyFirstMod loaded on Mono.

or:

MyFirstMod loaded on Il2Cpp.

Continue with Build your first mod and Common tasks.

Existing or advanced mod — analyze safely

Start without changing files:

s1interop analyze .
s1interop lint .
s1interop migrate . --dual-runtime --dry-run
s1interop verify-migration . --dual-runtime --include-source-migrations --build

Use the smallest feature that solves the current problem:

Goal Start with
Understand configurations, references, and source risks s1interop analyze .
Fail CI on supported high-confidence diagnostics s1interop lint . or build-hook
Preview separate Mono/IL2CPP project support s1interop migrate . --dual-runtime --dry-run
Test changes without touching the project s1interop verify-migration . --dual-runtime
Add selected generated diagnostics or helpers s1interop init . --dry-run
Experiment with backend-neutral facades Read the warning below, then use sdkgen narrowly

See Choose an adoption path, Use cases, and Commands.

Install the current alpha

S1Interop is distributed as a .NET tool on NuGet.org. You need .NET SDK 8 or newer:

dotnet tool install --global S1Interop --version 0.1.0-alpha.1
s1interop --version
s1interop --help

Use dotnet tool update --global S1Interop --version 0.1.0-alpha.1 when that version is already installed. Generated projects restore S1Interop.Generators from NuGet.org through their normal PackageReference; local game configuration contains only game paths.

Full installation details are in Install S1Interop.

Common tasks

# Read-only reports
s1interop doctor .
s1interop analyze .
s1interop lint .

# Preview or write ignored local configuration
s1interop setup .
s1interop setup . --apply

# Preview safe project changes
s1interop init . --dry-run
s1interop migrate . --dual-runtime --dry-run

# Verify in a disposable copy
s1interop verify-migration . --dual-runtime --include-source-migrations --build

--dry-run and --apply are mutually exclusive. File-changing commands keep dry-run behavior as the default.

Applied migrations write backups and a manifest under s1interop-runs/<run-id>/:

s1interop migrate rollback .\s1interop-runs\<run-id>\manifest.json

Experimental backend-neutral facades

The one-DLL generated-facade path is experimental and fragile.

Use it only when:

  • the mod's direct game access is narrow enough for the current generated surface;
  • both Mono and IL2CPP reference builds pass;
  • the exact shipped assembly is smoke-tested in both game branches;
  • a dual-runtime build remains available as the safe fallback.

Create an experimental scaffold explicitly:

s1interop new .\MyExperiment --backend-neutral --apply

For existing projects, prefer narrow usage-driven generation:

s1interop init . --dry-run
s1interop sdkgen . --dry-run

sdkgen --full-sdk is for local exploration, not the default beginner or production workflow. Unsupported, ambiguous, overloaded, generic, collection, cast, and runtime-wrapper shapes can still require manual code or separate runtime builds.

Read Backend-neutral SDK, SDK generation, and Real mod evidence before adopting it.

Scope and safety

S1Interop is low-level tooling. It does not replace gameplay libraries:

  • use S1API for items, NPCs, shops, saveables, UI, and other domain workflows;
  • use MAPI for building and model workflows;
  • use SteamNetworkLib for higher-level networking;
  • use DedicatedServerMod APIs for server/client addon lifecycles.

S1Interop must not commit or redistribute game assemblies, generated IL2CPP wrappers, decompiled output, AssetRipper exports, prefabs, scenes, textures, or local game paths.

Architecture

CLI
  -> read-only analysis and diagnosis
  -> migration planning
  -> optional rollbackable apply
  -> optional disposable verification/build

S1Interop.Generators
  -> compile-time diagnostics
  -> selected generated helpers
  -> experimental facades when explicitly declared

Repository layout:

src/S1Interop.Cli/          commands and user-facing reporting
src/S1Interop.Core/         analysis, setup, migration, generation, rollback, verification
src/S1Interop.Generators/   Roslyn generator and diagnostics package
tests/S1Interop.Tests/      portable and local integration coverage
docs/docfx/                 public documentation site

See Architecture, Testing, and Contributing.

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
0.1.0-alpha.1 103 7/31/2026