VSTS Build - Access to the registry key ... is denied
If you have a project which is registered for COM Interop then it will not build in Visual Studio Team Services (VSTS), complaining with an error like:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets (4640, 5) C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(4640,5): Error MSB3216: Cannot register assembly "d:\a\1\s\MyAddIn\MyAddIn\bin\Release\MyAddIn.dll" - access denied. Please make sure you're running the application as administrator. Access to the registry key 'HKEY_CLASSES_ROOT\MyAddIn.SomeClassName' is denied.
This is a hugely confusing error with a variety of causes, but if you see this error and your application is not designed or intended to interact with the registry, and it is set for COM interop, you need to turn off COM interop.
How to fix
For the affected project, open Project Properties (in Visual Studio). Go to the Compile tab, scroll down, turn off 'Register for COM interop'.
Now, if you need this flag to be turned on for regular build on your dev machines (hint: you do) then you may wish to make this change as part of your build process instead. In the affected
.csproj file, replace:
<RegisterForComInterop>true</RegisterForComInterop> with <RegisterForComInterop>false</RegisterForComInterop>
Automating this process is left as an exercise for you :)
Registering for COM interop causes MSBuild to write registry keys in order to register your assembly.
Ah, an even better idea is to change to
<RegisterForComInterop>false</RegisterForComInterop> only within the
Release|Any CPU or whatever configuration your VSTS uses! Then developers can continue to use Debug mode, which will generate the TLB needed for proper local debugging of COM components, but the build server will not try to generate it.