.NET Core can make use of C# 9 by making some changes to your
.csproj files. There is a way to opt all projects in a solution into this behaviour in a single place, through using a
Directory.Build.props file and / or a
Directory.Build.targets file. Here's how to do it.
"have you the good news about
I wrote recently about using C# 9 with in-process Azure Functions. What that amounted to, was using C# 9 with .NET Core.
One of the best things about blogging, is all that you get to learn along the way. After I put up that post, Daniel Earwicker was kind enough to send this message:
I was intrigued that Daniel was able to configure all the projects in a solution to use the same approach using some strange incantations named
Directory.Build.targets. Microsoft describes them thusly:
Prior to MSBuild version 15, if you wanted to provide a new, custom property to projects in your solution, you had to manually add a reference to that property to every project file in the solution. Or, you had to define the property in a
.propsfile and then explicitly import the
.propsfile in every project in the solution, among other things.
However, now you can add a new property to every project in one step by defining it in a single file called
Directory.Build.propsin the root folder that contains your source.
Let's see if we can put it to use.
Directory.Build.props: C# 9 for all#
So, rather than us updating each of our
.csproj files, we should be able to create a
Directory.Build.props file to sit alongside our
.sln file in the root of our source code. We'll add this into the file:
<Project> <PropertyGroup> <!-- use C# 9 --> <LangVersion>9.0</LangVersion> </PropertyGroup> <ItemGroup> <!-- allows some C# 9 support with .NET Core 3.1 https://github.com/manuelroemer/IsExternalInit --> <PackageReference Include="IsExternalInit" Version="1.0.1"> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <PrivateAssets>all</PrivateAssets> </PackageReference> </ItemGroup></Project>
Now we're free to add projects into the solution, which will already support C# 9 without us taking any further steps. It's as simple as that! Thanks to Daniel for sharing this super handy tip. ❤️🌻