Tag: dotnet

Quoting David Fowler

Why milestone 13.0?

13 is bigger than 10 and less than 14 and is a prime number. The versioning scheme signifies a break away from .NET versioning and a direction change in the product to be evergreen (latest version is what matters) and going polyglot
# / 2025 / 11 / 12

.NET 10 release

.NET 10 Overview

Just upgraded the blog to .NET 10 and wanted to quickly jot down my notes before calling it a night.

First, I was prompted to do this because I saw Heroku had a blog post about supporting .NET 10: https://www.heroku.com/blog/support-for-dotnet-10-lts-what-developers-need-know/. I'm glad they were proactive about supporting it on day 1, but I also don't love that I have to trust that my hosting provider will add the support.

The bulk of the work for upgrading was figuring out where I have references to .NET 9 and replacing them, and then upgrading my Nuget packages. I also upgraded to Aspire 13 (not sure why they went from 9->13 version).

I only ran into one deprecated API (KnownNetworks in my forwarding middleware), but that was an easy fix (just use the new KnownIPNetworks property instead).

Seems like everything is still working. Hoping to dive more into the details of .NET 10 the next couple of weeks and give the blog some more love and updates. Maybe even add a search feature and proper paging for posts.
# / 2025 / 11 / 11

.NET Aspire 9.3

Release Notes

I've updated this blog to Aspire 9.3. This particular release didn't have anything that I wanted to use right away, but this being such a simple blog website, it doesn't really need many of the fancy deployment features, especially since I deploy to Heroku and not Azure.

If I find any features I can use in the coming days, I'll create another post to highlight those.
# / 2025 / 05 / 20

FYI: Tracking down transitive dependencies in .NET

dotnet nuget why - command reference

I just found that there is a new(ish) command for figuring out where a transitive dependency comes from in your dotnet project (starting with dotnet 8.0.4xx)

dotnet nuget why <PROJECT|SOLUTION> <PACKAGE>
If you have a dependency in your project that has a vulnerability, you can use this to figure out which package is bringing it in. For example, System.Net.Http 4.3.0 has a high severity vulnerability. I've found instances where this package is brought into my projects by other packages. It's very handy to be able to trace it with a built-in tool. Before this was available, I would use the dotnet-depends tool, which is a great tool, but a little clunkier than I'd like, and doesn't seem to support central package management
# / 2025 / 04 / 18

.NET Aspire 9.2

Release Notes

I'm always excited when I see a new .NET Aspire release. The 9.2 update has lots of small quality-of-life improvements. The most interesting new feature for me is "Automatic database creation support". This means that if you add a Postgres database, it will get automatically created, but the best part is that you can also provide a custom SQL script. This lets you customize the creation. I might use this to seed the database with some fake data, so I don't have to manually create data.

This project is showing really great promise. The team is actively listening to developer feedback and reacting to it quickly.
# / 2025 / 04 / 10

.NET Aspire 9.1 just dropped

Release Notes

I'm very excited about this release of .NET Aspire. It's an absolute game changer for me, specifically in doing dev work on this blog.

This release has a bunch of great stuff, but I'm actually only interested in the bug fix to this issue. I really love the `dotnet watch run` command, which will perform a hot reload of your application when you make changes to the source files. Before this bug fix, sockets would not be freed up in a timely manner if the process ends, meaning that on reload, it would try to rebind to the existing ports and fail. This meant my workflow was 1. make a change 2. kill the running process 3. wait 10-15 seconds 4. run dotnet run again. Sometimes, I would have to rinse and repeat 3 and 4, if I hadn't waited long enough.

Now, I run `dotnet watch run`, make changes to my code (.cs, .css, and .razor files), and all I have to do to see the new changes is refresh my browser page. It's like magic. My dev loop has gone from ~30 seconds to see the changes reflected in the browser to near-instantly (the time it takes me to press F5 in Safari).

I've been very happy with .NET Aspire so far. But because I deploy to Heroku and not Azure, I can't take advantage of any of the deployment features. A side project I've been thinking about is to build a Heroku deployer based on a .NET aspire deployment manifest.
# / 2025 / 02 / 26