Skip to content
| Marketplace
Sign in
Visual Studio Code>Visualization>IOCO ViewNew to Visual Studio Code? Get it now.
IOCO View

IOCO View

Preview

Darren J. McLeod

|
3 installs
| (0) | Free Trial
An Interface Oriented Code Organization (IOCO) view of .NET solutions: the URLs of ASP.NET Core apps, the menus of WinForms and WPF apps and the commands of console apps, the files that serve each one, and how scattered each feature is.
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

IOCO View for VS Code

An IOCO view in the Explorer for ASP.NET Core solutions. IOCO, Interface Oriented Code Organization (Darren McLeod's post), organizes code by the app's public interface: you find and place code by following the URL. This view shows that interface for any codebase, whatever its folder layout, using the ioco map --json output from this repository's CLI.

What the view shows

Run IOCO: Show Candidate Affected Endpoints for the active file, or right-click a file in Explorer, the editor, or the IOCO tree and choose the command. A section above URLs lists related URL templates and HTTP methods, with every relationship reason visible below each candidate. Once opened, it follows active file changes and updates after a successful map refresh. An unmapped file explains how to check dependency depth and diagnostics. The section always states that file relationships do not prove runtime impact; an empty lookup does not establish that a file has no impact.

File lookup uses the shared analyzer's schema 1.1 fileEndpoints index, included in the bundled CLI. With an older CLI override, existing URL navigation still works and the lookup explains how to upgrade or switch back to the bundled CLI.

IOCO                                         EShopLayered.sln
├─ URLs                                      18 endpoints
│  ├─ GET /                                  page · Pages/Index
│  ├─ Catalog                                2 endpoints
│  └─ Order                                  4 endpoints
│     └─ Detail › {id?}
│        └─ GET /Order/Detail/{id?}          mvc · OrderController.Detail
│           ├─ route source    OrderController.cs
│           ├─ route config    Program.cs
│           ├─ view            NotFound.cshtml, Detail.cshtml
│           ├─ partial view    _OrderItems.cshtml
│           ├─ model           OrderViewModel.cs, OrderItemViewModel.cs
│           ├─ service         IOrderViewModelService.cs
│           └─ service implementation   OrderViewModelService.cs
├─ Scatter                                   6 features
│  └─ Order                                  10 folders · IOCO folder Order/
│     ├─ Controllers/     OrderController.cs      → Order/
│     ├─ Infrastructure/  SmtpEmailSender.cs      shared by 3 features (account, Manage, Order)
│     ├─ Interfaces/      IOrderViewModelService.cs  used by 2 features (api, Order); rule of three not met
│     └─ src/ApplicationCore/Services/  OrderService.cs  in another project
└─ Diagnostics (only when the CLI reports any)
  • URLs: the solution's URL tree. Segments lead to endpoints, and each endpoint shows its kind (page, mvc or minimal api) and its declaration. Under an endpoint, the files that serve it are grouped by role: route source, route config, handler, view, partial view, page model, model, service and service implementation. A role this version doesn't know goes under other. Hover over a file to see why it is included (the CLI's reasons, with the injection depth for services). Injected types that aren't in the source are listed under external dependencies.
  • Menus and Commands (when the solution has Windows desktop or console projects): the menu tree of each WinForms or WPF app and the command tree of each command-line app, shown next to the URL tree rather than merged into it. A menu item is labelled by its path (Orders > Export > To CSV) and a command as typed (contoso orders export), with the framework it was found in (winforms, wpf, system.commandline, spectre.cli, commandlineparser, mcmaster, cocona, consoleappframework or args) and its handler. Its files are grouped by role in the same way: the handler is the route source, the .Designer.cs, .xaml or command setup that declares it is route config, and the forms and windows it opens are views. Toolbar buttons, context-menu items and WPF ribbon controls (map schema 1.4) appear in the menu tree under their feature, labelled MainForm toolbar > Print or Ribbon > Home > Paste, with winforms toolbar button, wpf ribbon control and so on as their kind. Counts are given by kind (2 menu items, 1 toolbar button). A button or item that runs the same handler as a menu item is not a second entry. It is listed under that menu item's also reached from, and selecting it opens its declaration. A desktop app with no menu is mapped by its windows (map schema 1.4): the startup form or window and the windows reachable from it are entries of kind winforms window or wpf window, one per window, each with its own files. The windows that open a window are listed under its also reached from, and selecting one opens the code that opens it.
  • Other (only when needed): endpoints whose organizer this version of the extension doesn't know (for example from a newer CLI), listed flat so none are silently left out of the map.
  • Scatter: for each feature (first URL segment, top-level menu or first command word), the folders its files live in today. Each file shows where IOCO would put it: → Order/ for a file only this feature uses, ✓ in Order/ when it's already there, used by 2 features when the rule of three isn't met yet, shared when three or more features use it, or in another project.
  • Diagnostics: projects that failed to load, routes that couldn't be resolved, and so on.

Clicking an endpoint opens its declaration at the right line. Clicking a route source does the same. Other files open at the top, because the JSON gives no line for them.

Finding the solution

  1. The ioco.solutionPath setting (a .sln, .slnx, .csproj, .vbproj or a directory). A relative path is resolved against the first workspace folder.
  2. Otherwise, the solution you picked earlier in this workspace.
  3. Otherwise, a single .sln in the workspace, or a single .csproj or .vbproj if no solution is found.
  4. Otherwise, you're asked to pick from the solutions/projects found, or browse. Use IOCO: Choose Solution… (the folder icon in the view's title bar) to change it later.

Install and map a project

The packaged VS Code extension includes a version-matched, framework-dependent IOCO CLI. Installing the extension does not require an IOCO repository clone, a separate CLI package, or a NuGet restore. The extension runs the bundled ioco.dll with dotnet.

The validated preview hosts are local Windows x64 (build 10.0.26200) with VS Code 1.140.0, and Windows x64 (build 10.0.26300) with VS Code 1.142.0, with the .NET 8 runtime. The 1.142.0 run also covers the WinForms, WPF and console menu and command workflows on a mixed desktop solution. The recorded host checks used an isolated profile and an installed VSIX, including a fresh single-project workspace with no IOCO settings. A separate isolated runtime-only check installed the VSIX with VS Code 1.141.0 and mapped the sample with the exact bundled CLI using .NET 8.0.31, no SDK, no repository, and no prebuilt bin/obj assets. It found 2 projects and 18 endpoints with no diagnostics. The .NET SDK and separate MSBuild tools are not customer prerequisites. VS Code 1.141.0 is not yet a supported preview host, because its extension-host UI suite has not completed.

The manifest declares VS Code 1.85+ API compatibility and the CLI permits runtime roll-forward, but other VS Code/runtime versions, Windows ARM64, macOS, Linux, and remote SSH/container/WSL hosts have not been validated and are excluded from preview support claims. Remote setups would need .NET on the machine running the extension host. If .NET is absent or older than 8, IOCO keeps the last successful map (if any), links to the .NET 8 runtime download, and asks you to reload VS Code after installing it. Install the .NET Runtime 8 or later on the machine running the extension host; the SDK is not required.

Install IOCO View from the VS Code Marketplace when available, or install a supplied .vsix using Extensions: Install from VSIX…. Open an ASP.NET Core workspace; IOCO maps a single solution automatically, or a single .csproj or .vbproj when the workspace has no solution. Use IOCO: Choose Solution… when there are several candidates, or browse to a project directly.

The ioco.cliPath setting can point to a standalone executable to override the bundled CLI. PATH and repository-source fallbacks are used only by development builds that do not contain the CLI bundle.

The extension reads schemaVersion from the output. It accepts any 1.x, ignores properties it doesn't know, and refuses a different major version with a message saying which version it got.

Refreshing

  • IOCO: Refresh (the refresh icon in the view's title bar).
  • Automatically after you save a .cs, .cshtml, .xaml or .resx file, or ioco.json. Saves are debounced (ioco.autoRefreshDelay, 1500 ms by default), and a newer run cancels one still running. Turn this off with ioco.autoRefresh.
  • When ioco.solutionPath, ioco.cliPath or ioco.depth changes.

Cancellation currently means that a newer map supersedes and terminates the previous CLI run; there is no separate user-facing Cancel command. Cancellation through Windows .cmd/.bat CLI overrides or tools that spawn child processes has not been verified.

If a refresh fails, the last good map stays in place and the view explains what went wrong. The IOCO output channel logs each command and the CLI's stderr.

Settings

Setting Default
ioco.solutionPath "" What to map. Empty: find it as described above.
ioco.cliPath "" Optional standalone ioco executable. Empty: use the bundled CLI.
ioco.depth 1 ioco map --depth: levels of injected dependencies to include. Not used when the repository's ioco.json configures the mapped solution: its depth and project scope apply, as in CI.
ioco.autoRefresh true Re-map on save of .cs/.cshtml/.xaml/.resx files and ioco.json.
ioco.autoRefreshDelay 1500 Debounce, in milliseconds.

Privacy

The extension runs fully offline and sends nothing anywhere. It has no telemetry, and the only process it starts is the CLI, run locally without a shell, with DOTNET_CLI_TELEMETRY_OPTOUT=1 and DOTNET_NOLOGO=1. The CLI only reads files. The bundled CLI does not restore packages. A development-source fallback using dotnet run may restore the CLI project the first time.

Editions, trial and upgrade

  • Community (free). Mapping, navigation, the reasons for each file, Scatter, diagnostics and the CLI's map JSON are free for any use, including commercial work. No account or license key is needed, and Community features never expire.
  • Pro trial (free, 14 days, no payment card). IOCO: Show Candidate Affected Endpoints (file-to-URL lookup) is a Pro feature. After a successful first map, start the trial with IOCO: Start 14-day Pro Trial, the sparkle icon in the view's title bar, or from the prompt that appears when you use the lookup. The trial starts when you choose it, not at installation, and is limited to one per person. IOCO: License Status shows what is active.
  • When a trial or license ends, IOCO falls back to Community. The map and every other Community feature keep working. Only the Pro lookup stops, and output you already generated is never deleted or locked.
  • Paid Pro and Team licenses are not on sale yet, and this preview has no checkout or in-product purchase. A signed license file you are given is activated offline with IOCO: Activate Signed License. One named-user license covers VS Code, Visual Studio and the CLI. License checks run on your computer and send nothing.

Support

Ask questions and report problems on the Q&A tab of this Marketplace page. Supported configurations are the validated preview hosts listed under Install and map a project.

License

IOCO is proprietary software under the IOCO End User License Agreement, shown on this page's License tab and shipped in the extension as LICENSE.txt. If this page and the agreement differ, the agreement controls. Third-party components and their licenses are listed in THIRD-PARTY-NOTICES.txt, also shipped in the extension.

  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
  • Your Privacy Choices
  • Consumer Health Privacy
© 2026 Microsoft