Blocking frameworks
WebForms, WCF hosting, System.Web, Remoting, MVC 5. No counterpart on modern .NET, so these are re-architecture rather than a port.
Run my scanner on your own solution, on your own machine, and see every finding, its confidence tier and its effort range before you speak to me. Then, if the number matters enough to defend, I will price it for a fixed fee.
Windows and macOS downloads are signed, and the macOS package is notarized by Apple. The certificates belong to Matthew Williams, owner of MW Creative LLC, the parent company of MW Consulting. That is the name your machine will show you before it runs anything.
already have the .NET 10 SDK? dotnet tool install -g MigrationScan.Tool
MigrationScan · target net10.0
Projects scanned 3
Findings 23 blocker 3 · high 7 · medium 11 · low 2
Estimated effort 29.3–88 engineer-days
Needs decision 1 architectural, left unpriced
Not assessed 1 Woodgrove.Database (.sqlproj)
Third-party 6 distinct references, inventory only
Staying on Windows 17 findings · 23.8–72 days · 6 fewer, all in one project
MIG3001 blocker · certain · effort blocker
ASP.NET WebForms
Woodgrove.Web/Woodgrove.Web.csproj:2
MIG6001 blocker · probable · effort large (2 occurrences)
BinaryFormatter
Woodgrove.Domain/StatementArchive.cs:21
Woodgrove.Domain/StatementArchive.cs:29
MIG1010 high · certain · effort large
Vendored DLL with no source and no NuGet equivalent
Woodgrove.Interop/Woodgrove.Interop.csproj:34
MIG4003 high · probable · effort medium
System.Management / WMI
Woodgrove.Interop/BranchHostInventory.cs:2
wrote migrationscan-report.json no source code · source file paths as opaque ids
Four of the 23 findings, and each one shortened. Every line above is exactly what the tool prints. The real run also carries the message and the remediation text for each rule, and lists all 23.
Two questions, one scan
Every report prices both futures. Flip the target below and watch which findings stop mattering. This is the Woodgrove Banking sample estate, scanned with the shipping build.
Findings that break everywhere keep full severity either way: WebForms, BinaryFormatter, Remoting, MVC 5. Three blockers and two low-severity items are identical in both columns, and the one item needing an architectural decision stays unpriced in both.
These figures are heuristic planning aids derived from static analysis and are not a quote.
33 rules, 8 categories
Every rule has a page explaining why it fires and what to do about it. The scanner writes the link into the report.
WebForms, WCF hosting, System.Web, Remoting, MVC 5. No counterpart on modern .NET, so these are re-architecture rather than a port.
Non-SDK project files, packages.config, GAC and COM references, legacy project types. Mechanical, but everything else waits on it.
The Registry, WMI, P/Invoke, Active Directory, the event log. The build stays green and the process throws in production. This is the category that ends up in the incident review.
System.Data.SqlClient, OleDb off Windows, and LINQ to SQL, which has no supported successor at all.
BinaryFormatter, removed in .NET 9 and throwing at runtime, plus code access security and obsolete cryptography.
Packages with no version for the target, and vendored assemblies with no NuGet successor to upgrade to.
Encoding.Default changing behaviour, and code-page encodings that throw unless a provider is registered first.
ConfigurationManager and app.config reads that need a package or a move to Microsoft.Extensions.Configuration.
Reading the report
A finding can be high impact and easy, or low impact and unbounded. Every row carries all three axes so you can sort by the one you actually care about.
Rule Severity Tier Effort Location
MIG1006 Medium Certain Medium Woodgrove.Interop.csproj:22
COM reference ('FabrikamImagingLib'). Works on
modern .NET only when targeting Windows.
MIG1010 High Certain Large Woodgrove.Interop.csproj:34
Vendored assembly ('Litware.ChequeScanner') from a
checked-in path, not a NuGet package.
MIG4003 High Probable Medium BranchHostInventory.cs:2
Uses WMI (System.Management). Windows-only on
modern .NET, throws elsewhere.
Estimated effort: 11.5-35 engineer-days
Certain, read from project XML. Probable, matched on the syntax tree without a resolved compilation, so some are false positives. Verified, read from compiled assembly metadata. The tool says which, rather than presenting everything as fact.
Blocker down to low. A blocker stops the migration proceeding, and it can still be a bounded piece of work. Replacing BinaryFormatter is high impact and perfectly estimable.
Small, medium, large, or unbounded until somebody decides. Items in that last group are counted separately and left unpriced rather than folded in with a guess.
| Effort small or medium | Effort large or blocking | |
|---|---|---|
| Blocker or high | 6 | 4 |
| Medium or low | 13 | 0 |
Plus 1 item needing an architectural decision before it can be estimated at all. Effort figures are planning aids. They are never a quote.
The expensive unknowns are usually somebody else's code. A scanner that quietly skipped them would produce a smaller number and a worse plan, so the report names them instead.
Projects that are not C# or VB are named and counted, never skipped silently. They still need planning and they are not in the effort estimate.
Woodgrove.Database SQL Server database project Woodgrove.Database/Woodgrove.Database.sqlproj
Six distinct third-party references on this estate. Nothing here is counted or estimated. It is the list to research before anyone commits to a plan.
nuget Litware.Web.Controls 2018.2.611.40 nuget Microsoft.AspNet.Mvc 5.2.9 nuget Microsoft.AspNet.Web.Optimization 1.1.3 nuget Proseware.Json 9.1.2 [3 projects] dll Litware.ChequeScanner 3.0.0.0 com FabrikamImagingLib 3.0
I do not give you a number for work I have not sized. If something in your estate cannot be priced yet, it shows up as a named exclusion rather than an optimistic guess.
Written for the security review before you send it on. It should take thirty seconds to clear.
Dependency names stay on purpose. Nobody can assess a component without knowing which one it is.
Redaction covers the JSON, which is the file you send. Your console output, Markdown report and SARIF keep full paths, because those stay on your machine and your developers need them.
The scanner gives you ranges. The assessment gives you a price, with the unknowns resolved and the exclusions written down.
Send the JSON, I read it, and we spend half an hour on what it means. No deck, no obligation.
Send a report for a free readMigration assessment, estates up to 50 projects. Larger estates quoted after a look at your scan.
Credited in full against the migration if you go ahead with me.
No. You run the scanner yourself and send me the JSON report. It carries no source code, and every source file path in it is replaced by an opaque id, so it clears a security review without an exception.
Then your number is the smaller one. COM, P/Invoke, the Registry and WMI keep working on modern .NET as long as you target Windows. The report prices both, so you can see what the choice is worth before you make it.
Partly, and the report says so. SQL, SSRS, SSIS, WiX and deployment projects are named and counted in a not-assessed section rather than skipped. Resolving them is part of the paid assessment.
About a week from receiving your scan, most of which is researching third-party components and resolving what the tool could not size. The working session is scheduled once the proposal is with you.
Both, and they are separate decisions. Plenty of clients take the proposal and run the work in-house. If you do want me on it, the assessment fee comes off the first invoice.
It becomes a named exclusion with the reason and what it would take to resolve. A dead vendor component with no successor is a decision for you, not a number I can invent.
The scanner is free and it will tell you more in ten minutes than a discovery call will. If the number matters, I am one email away.