Add AVDL Support to a .NET Project
Tags: dotnet, avro, kafka
Published: 2021-01-24 19:56:28

---
series: Avro and .NET
---

By now, we have a good grasp on:

- Taking Avro IDL files and generating C# classes
- Automating the above so we can do it on lots of files with ease

In this final step, I will create a C# project and configure it in a way so developers only need to add/modify `avdl` files and _build_.

# Create the Project

We'll start from scratch, by creating the project and then adding an `Avro` folder:

```bash
dotnet new classlib --name MyProject
cd MyProject
mkdir Avro
```

Add the package [Confluent.SchemaRegistry.Serdes.Avro] (https://www.nuget.org/packages/Confluent.SchemaRegistry.Serdes.Avro/):

```bash
dotnet add package Confluent.SchemaRegistry.Serdes.Avro --version 1.5.3
```

Then copy the `AVDL` folder and `Generate.ps1` script from the [previous post](/cainux/automate-avdl-to-c-generation-1mk5).

The project should end up looking like:

```
MyProject
├── Avro
│   ├── AVDL
│   │   └── ExampleMessage.avdl
│   └── Generate.ps1
├── Class1.cs
└── MyProject.csproj
```

# Modify .csproj

Before building the .NET project, we want MSBuild to generate our Avro classes. This can be done as a PreBuild step which is configured within `MyProject.csproj`.

## Inform MSBuild

Open the file then add the following:

```xml
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
  <Exec WorkingDirectory="$(ProjectDir)Avro" Command="pwsh -ExecutionPolicy RemoteSigned -File Generate.ps1" />
  <ItemGroup>
    <Compile Include="$(ProjectDir)Avro/_generated/**/*$(DefaultLanguageSourceExtension)" Exclude="@(Compile)" />
  </ItemGroup>
</Target>
```

This does a couple of things:

* Execute the PowerShell script to generate Avro classes first
* Inform MSBuild of the new files, but also ensure not to include them twice if they already exist (see [here](https://stackoverflow.com/a/59738881/42200))

## Tweak for Visual Studio

Also, add:

```xml
<ItemGroup>
  <EmbeddedResource Include="Avro\AVDL\**\*.avdl" />
</ItemGroup>
```

This is a little hack to trick Visual Studio into marking the build as out of date if you make any changes in the AVDL folder.

## Build

Now, we're ready to build:

```bash
dotnet build
```

Which results in:

```
Microsoft (R) Build Engine version 16.7.0+7fb82e5b2 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  Restored /home/cainux/code/MyProject/MyProject.csproj (in 313 ms).
  Generating Avro classes...
  avro-tools not found, downloading from https://repo1.maven.org/maven2/org/apache/avro/avro-tools/1.10.0/avro-tools-1.10.0.jar to /home/cainux/.avro-tools/avro-tools-1.10.0.jar
  Running: /home/cainux/.dotnet/tools/avrogen -s ./_generated/avro/schema/ExampleMessage.avsc ./_generated/avro/classes
  MyProject -> /home/cainux/code/MyProject/bin/Debug/netstandard2.0/MyProject.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)
```

# Conclusion

We went from manually generating C# classes from Avro IDL files to making it happen automagically withing a .NET project. Developers only need to put their AVDL files in the right place and run build to generate the classes. Now you can focus on building the rest of your application with one less thing to think about.

If you're managing your code with source control (if not, why on earth not?!) such as Git - remember to ignore the `_generated` folder and its contents as they are build assets and shouldn't be checked in to source control.