<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/fast-focus-using-copilot-to-build-migration-tools-8kmuyg5hk" -->

---
title: Fast Focus: Using Copilot to Build Migration Tools
description: A staff software engineer at Rocket Mortgage describes building a .NET migration tool to convert code from an old custom logging library to a newer internal...
canonical: https://daily.dev/posts/fast-focus-using-copilot-to-build-migration-tools-8kmuyg5hk
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Fast Focus: Using Copilot to Build Migration Tools | daily.dev
og:description: A staff software engineer at Rocket Mortgage describes building a .NET migration tool to convert code from an old custom logging library to a newer internal...
og:url: https://daily.dev/posts/fast-focus-using-copilot-to-build-migration-tools-8kmuyg5hk
og:image: https://api.daily.dev/og/posts/8kmuYG5HK.png
og:image:alt: Fast Focus: Using Copilot to Build Migration Tools
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Fast Focus: Using Copilot to Build Migration Tools

**[.NET Blog](https://daily.dev/sources/dotnet)** · 19 min read · 6 upvotes · 0 comments

## Summary

A staff software engineer at Rocket Mortgage describes building a .NET migration tool to convert code from an old custom logging library to a newer internal logging library. Rather than relying purely on Copilot prompting, which gave inconsistent results, he combined Copilot with Roslyn (the .NET compiler API) to generate a deterministic console tool packaged as a NuGet package. Copilot scaffolded the Roslyn-based project structure, and the team added custom handling for central package management files and code formatting via dotnet format. The tool worked well overall but missed some corner cases like certain extension methods, causing compile failures for some users. The talk emphasizes treating AI tools as productivity aids while using deterministic tooling like Roslyn for tasks requiring reliability.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.youtube.com/watch?v=LFNp66P_OKY>

## Questions this post answers

### How can I use Roslyn to build a tool that migrates code from one library API to another?

Create an MSBuildWorkspace, open each solution, enumerate its C# projects, and walk the syntax tree to find invocations of the old library's APIs. Transform matching invocation nodes into calls to the new API, update NuGet references in Directory.Packages.props files via XML processing, then shell out to dotnet format to clean up formatting on changed files for a deterministic, testable migration.

_Developers planning a library migration can find more Roslyn tooling patterns and AI workflow write-ups on daily.dev._

### Why did prompting Copilot directly to convert code between logging libraries give inconsistent results?

Copilot prompting alone produces stochastic output, so running the same conversion prompt on different occasions yields varying success because large language models are inherently non-deterministic. For a one-and-done migration task where the output must be complete and reliable, a deterministic approach using Roslyn's compiler API to programmatically analyze and transform code proved more dependable than repeated prompting.

_Teams weighing AI prompting against deterministic tooling for migrations can track these tradeoffs on daily.dev._

## Similar posts on daily.dev

- [A step-by-step guide to modernizing .NET applications with GitHub Copilot agent mode](https://daily.dev/posts/a-step-by-step-guide-to-modernizing-net-applications-with-github-copilot-agent-mode-lcnalhjpu) · .NET Blog · 4 upvotes · 0 comments
- [Doing More with GitHub Copilot as a .NET Developer](https://daily.dev/posts/doing-more-with-github-copilot-as-a-net-developer-dektd3qud) · ASP.NET Blog · 34 upvotes · 4 comments
- [GitHub Copilot CLI for .NET Developers: Real Workflows on a C\# Codebase](https://daily.dev/posts/github-copilot-cli-for-net-developers-real-workflows-on-a-c-codebase-eyicrg3rl) · We Are .NET · 3 upvotes · 0 comments

---

Tags: [#github](https://daily.dev/tags/github), [#.net](https://daily.dev/tags/.net), [#c#](https://daily.dev/tags/c#)

[View this post on daily.dev](https://daily.dev/posts/fast-focus-using-copilot-to-build-migration-tools-8kmuyg5hk)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Fast Focus: Using Copilot to Build Migration Tools","url":"https://daily.dev/posts/fast-focus-using-copilot-to-build-migration-tools-8kmuyg5hk","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/fast-focus-using-copilot-to-build-migration-tools-8kmuyg5hk"},"datePublished":"2026-08-18T16:14:14.256Z","dateModified":"2026-08-18T16:14:36.621Z","description":"A staff software engineer at Rocket Mortgage describes building a .NET migration tool to convert code from an old custom logging library to a newer internal...","image":"https://i.ytimg.com/vi/LFNp66P_OKY/sddefault.jpg","thumbnailUrl":"https://i.ytimg.com/vi/LFNp66P_OKY/sddefault.jpg","isAccessibleForFree":true,"articleSection":".NET Blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":".NET Blog","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/f23eb59371bd4f07aeef64c4eef73266","url":"https://daily.dev/sources/dotnet"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/fast-focus-using-copilot-to-build-migration-tools-8kmuyg5hk","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":6},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"github,.net,c#","timeRequired":"PT19M","video":{"@type":"VideoObject","name":"Fast Focus: Using Copilot to Build Migration Tools","description":"A staff software engineer at Rocket Mortgage describes building a .NET migration tool to convert code from an old custom logging library to a newer internal...","thumbnailUrl":"https://i.ytimg.com/vi/LFNp66P_OKY/sddefault.jpg","uploadDate":"2026-08-18T16:14:14.256Z","duration":"PT19M","url":"https://api.daily.dev/r/8kmuYG5HK","embedUrl":"https://www.youtube.com/embed/LFNp66P_OKY"}}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":".NET Blog","item":"https://daily.dev/sources/dotnet"},{"@type":"ListItem","position":3,"name":"Fast Focus: Using Copilot to Build Migration Tools"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/fast-focus-using-copilot-to-build-migration-tools-8kmuyg5hk#faq","mainEntity":[{"@type":"Question","name":"How can I use Roslyn to build a tool that migrates code from one library API to another?","acceptedAnswer":{"@type":"Answer","text":"Create an MSBuildWorkspace, open each solution, enumerate its C# projects, and walk the syntax tree to find invocations of the old library's APIs. Transform matching invocation nodes into calls to the new API, update NuGet references in Directory.Packages.props files via XML processing, then shell out to dotnet format to clean up formatting on changed files for a deterministic, testable migration. Developers planning a library migration can find more Roslyn tooling patterns and AI workflow write-ups on daily.dev."}},{"@type":"Question","name":"Why did prompting Copilot directly to convert code between logging libraries give inconsistent results?","acceptedAnswer":{"@type":"Answer","text":"Copilot prompting alone produces stochastic output, so running the same conversion prompt on different occasions yields varying success because large language models are inherently non-deterministic. For a one-and-done migration task where the output must be complete and reliable, a deterministic approach using Roslyn's compiler API to programmatically analyze and transform code proved more dependable than repeated prompting. Teams weighing AI prompting against deterministic tooling for migrations can track these tradeoffs on daily.dev."}}]}
```

