This post was most recently updated on July 27th, 2024.
2 min read.… or “How to bang your head on a wall for hours on end when developing a MAUI application?” 😂
This article explains how to fix a surprising error you might get when trying to run a MAUI app in Windows. For me, it was thrown when I was simply reading a file from the disk, but I suspect the same or similar error (“System.TypeInitializationException: ‘The type initializer for ‘WinRT.ActivationFactory`1′ threw an exception.’ – COMException: ClassFactory cannot supply requested class”) can probably be thrown for other reasons as well.
Anyway – let’s take a closer look at the issue and when it was thrown for me, shall we?
Problem
The error gets thrown at perhaps the unlikeliest part of your code ever. When you’re reading a file with System.IO.File on Windows. Like – shouldn’t System.IO stuff work in platform-specific MAUI builds? And it works just fine on Android. But on Windows, this code throws:
using Stream fileStream = System.IO.File.OpenRead(filePath);
using StreamReader reader = new StreamReader(fileStream);
var c = await reader.ReadToEndAsync();
And the error you get is a pretty drastic one:
System.TypeInitializationException: 'The type initializer for 'WinRT.ActivationFactory`1' threw an exception.' COMException: ClassFactory cannot supply requested class
Perhaps you can get similar errors for different reasons, too. But I suspect the fix might quite often be the same, as far as you’re trying to build stuff with MAUI.
Okay – so what to do to fix the issue at hand?
Solution
Annoying, but I haven’t found the proper fix to this. That’s not to say I wouldn’t have got a pretty good set of workarounds documented below for trying out! 😁
Time needed: 30 minutes
Solving “System.TypeInitializationException: ‘The type initializer for ‘WinRT.ActivationFactory`1’ threw an exception.'” in MAUI app?
- Restart Visual Studio
Boring, but it’s a good idea to start by restarting Visual Studio.
- Restart your machine
Even more boring, but restarting your machine is the next step. I had to restart mine before the next steps actually worked.
So since you’ll probably need to do this anyway, probably a good idea to try it first before trying the long-running commands in steps 3 & 4.
Come back when you’re done! - Disable packaging in Windows to avoid unnecessary broken dependencies
In case you’re missing the following property in your project’s .csproj file’s <PropertyGroup></PropertyGroup> -node, you could try adding it (unless you want to publish an appx package, and I don’t think anyone does?)
<WindowsPackageType>None</WindowsPackageType>
I haven’t verified this works, as it was suggested by a reader – thanks for the contribution, @takipsizad! - Repair .NET workloads
The following command – run in Visual Studio Developer Shell (or in any other shell, really) – should fix your workloads if they’re broken for whatever reason. I suppose this should’ve fixed the issue for me, but it didn’t.
dotnet workload repair
- Reinstall maui-windows workload
Maybe just your maui-windows .NET workload has broken. And maybe workload repair didn’t fix it for whatever reason. Who knows – it’s easy enough to try just reinstalling maui-windows – and somehow this one finally fixed the issue for me:
dotnet workload install maui-windows
Hope this helps! If you’ve figured out other ways to fix this, let me know in the comments section below!
References
A couple of sources I found useful in the investigation:
- https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-workload-install
- https://learn.microsoft.com/en-us/answers/questions/1087945/there-is-no-runtime-pack-availabel-for-microsoft-a
- https://learn.microsoft.com/en-us/windows/apps/package-and-deploy/project-properties
- “Performing cleanup” – Excel is stuck with an old, conflicted file and will never recover. - November 12, 2024
- How to add multiple app URIs for your Entra app registration? - November 5, 2024
- How to access Environment Secrets with GitHub Actions? - October 29, 2024