I recently created a build pipeline in Azure DevOps for my Azure Functions sample project. I wanted a repeatable process to build my admitedly small project as I upgraded it from the V2 to V3 runtime. I wasn’t expecting too much trouble, but as with any upgrade, things are never completely smooth.
Reasons to Upgrade
From a .NET perspective, the strongest reason to move to the V3 runtime is to unlock the features available in .NET Core 3.1. There are many new language features and a bunch of performance improvements that make for a compelling upgrade. .NET Core 3.1 is the Long-Term Support version of .NET Core, so you can run functions under this version for a long time without needing to upgrade.
It’s a good time to upgrade functions that are built on the V1 runtime to V2 or V3. Microsoft aren’t deprecating any runtime versions yet, but I can’t imagine this will be true forever. On the bright side, Azure services typically provide a long notice period before deprecation, so you likely won’t be blindsided with a rush upgrade.
The first step was to edit the functions project file to use
netcoreapp3.1 as the target framework, along with the V3 runtime that supports it:
<PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <AzureFunctionsVersion>v3</AzureFunctionsVersion> </PropertyGroup>
In theory, that should have done it, but upon building the solution, I was confronted with an unexpected error:
System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=188.8.131.52, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
Upon closer inspection of the project file, I noticed that it was referencing an old version of Microsoft.NET.Sdk.Functions, v1.0.27. That version shouldn’t be used for V2 functions, let alone V3. I updated the dependency to v3.0.1, which made the build and tests pass, locally and in Azure DevOps.
Overall, the upgrade was fairly painless. It would have been much harder to move directly from V1 to V3, as V1 is based on .NET Framework. I’ve found the best way to upgrade V1 functions projects is to create a V2 functions project alongside and copy the code over to it. In-place upgrades are difficult because of the change from .NET Framework to .NET Core.
Now that your project is updated, it’s time to play with all the new features of the V3 runtime, including the latest C# version, the latest tooling, and the new functions portal in Azure.