I recently rewrote Moxy – a Roslyn source generator that allows mix-ins in C#.
My new version had an odd problem. When my consuming product was built I would get a
NullReferenceException, which was useless to me because it didn’t come with a callstack. However, when I switched out the NuGet package and referenced
Moxy directly I wouldn’t get the problem.
Seeing the problem only occurred during a
dotnet build I tried adding the following code to the
if (!System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Launch();
I was disappointed to see this didn’t work, but was able to fix it by creating a
.reg file with the following contents and importing it using
regedit. [Credit – Answered by Implex1, April 2007].
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\SensLogn] "DLLName"="WlNotify.dll" "Lock"="SensLockEvent" "Logon"="SensLogonEvent" "Logoff"="SensLogoffEvent" "Safe"=dword:00000001 "MaxWait"=dword:00000258 "StartScreenSaver"="SensStartScreenSaverEvent" "StopScreenSaver"="SensStopScreenSaverEvent" "Startup"="SensStartupEvent" "Shutdown"="SensShutdownEvent" "StartShell"="SensStartShellEvent" "PostShell"="SensPostShellEvent" "Disconnect"="SensDisconnectEvent" "Reconnect"="SensReconnectEvent" "Unlock"="SensUnlockEvent" "Impersonate"=dword:00000001 "Asynchronous"=dword:00000001
My debugger window was now opening whenever I did a
dotnet build but, unfortunately, I still wasn’t seeing the bug. So next I wanted to release a debug version of my package so I could consume that instead, and then debug when it failed.
Next I right-clicked my
csproj file and went to the
- I selected the Release configuration at the top of Visual Studio.
- I opened up
Optimize codeI unticked the
Debug symbolsI selected
Embedded in DLL/EXE, portable across all platforms.
After I published the package and then consumed it, my
dotnet build process triggered my debugger, and the bug was fixed in a matter of minutes!
As I said earlier, I am not entirely sure which of these steps were completely necessary, perhaps only the
Debugger.Launch() code and the
.reg file were necessary.