• Backwards compatible ignoring Roslyn Analyzer warnings

    The “Roslyn” Analyzers are a great new feature that shipped in Visual Studio 2015. One nice thing about them, is you can still add them to a project even if the target platform for a project is not .NET 4.6. This makes sense, as the analyzers just run as part of the compiler – they don’t affect the generated code in any way.

    This also means you can safely add analyzers to a project and get all the warnings/errors when using Visual Studio 2015, but you can still open the same project in an older version of Visual Studio and the analyzers are just ignored.

    Sometimes you want to suppress a specific warning. It turns out there’s two ways to do this:

    SuppressMessageAttribute

    The first is the same that you would have done to suppress an old FxCop/Code Analysis violation – using the System.Diagnostics.CodeAnalysis.SuppressMessageAttribute attribute.

    [SuppressMessageAttribute(“Microsoft.Performance”, “CA1811:AvoidUncalledPrivateCode”)]

    It turns out, the only bit that Roslyn really cares about is the second parameter. As long as it starts with a valid CheckId, then that violation will be suppressed. My observation is that the first parameter (category) doesn’t seem to matter too much.

    [SuppressMessageAttribute(“StyleCop”, “SA1514”)]

    Pragmas

    The new compiler is much more flexible in disabling warnings and errors. You can now use a compiler pragma to disable a particular warning or error code – and the code isn’t just for the C# language, it can be for an analyzer too. eg.

    #pragma warning disable SA1514
    

    One advantage to using pragmas is that you can re-enable them if you want to limit the scope of the pragma to just a particular block of code in a single file.

    Backwards-compatible pragmas

    The only problem with the pragma approach above is if you try and compile the source code with the older non-Roslyn C# compilers. They haven’t ever heard of this ‘SA1514’ that you’re referring to and will generate a compiler error. The workaround is to wrap the pragmas with a conditional block, like this:

    #if VS2015
    
    #pragma warning disable SA1514
    
    #endif
    

    The final part is to define ‘VS2015’. Do this by editing the .csproj file and adding the following block (insert it after the last configuration/platform-specific PropertyGroup)

    <PropertyGroup>
      <DefineConstants Condition="$(VisualStudioVersion) &gt;= 14 ">$(DefineConstants);VS2015</DefineConstants>
    </PropertyGroup>
    

    This has the effect of defining a conditional constant only when we’re compiling with Visual Studio 14 (aka 2015) or above. For earlier versions, the constant is undefined and so the pragma is not visible to the compiler.

  • Time for a new laptop?

    I thought it might be my imagination, but running powercfg.exe /batteryreport shows the truth – my laptop battery isn’t what it used to be.

    Battery capacity history | PERIOD | FULL CHARGE CAPACITY | DESIGN CAPACITY | | — | — | — | | 2015-11-17 - 2015-11-23 | 5,656 mWh | 6,600 mWh | | 2015-11-23 - 2015-11-30 | 5,480 mWh | 6,600 mWh | | 2015-11-30 - 2015-12-07 | 5,177 mWh | 6,600 mWh | | 2015-12-07 - 2015-12-14 | 5,177 mWh | 6,600 mWh | | 2015-12-14 - 2015-12-21 | 5,177 mWh | 6,600 mWh | | 2015-12-21 - 2015-12-28 | 5,177 mWh | 6,600 mWh | | 2015-12-28 - 2016-01-04 | 5,129 mWh | 6,600 mWh | | 2016-01-04 - 2016-01-11 | 4,059 mWh | 6,600 mWh | | 2016-01-12 | 3,276 mWh | 6,600 mWh | | 2016-01-13 | 3,276 mWh | 6,600 mWh | | 2016-01-14 | 3,276 mWh | 6,600 mWh | | 2016-01-15 | 3,276 mWh | 6,600 mWh | | 2016-01-16 | 3,276 mWh | 6,600 mWh | | 2016-01-17 | 3,276 mWh | 6,600 mWh | | 2016-01-18 | 3,276 mWh | 6,600 mWh | | 2016-01-19 | 3,276 mWh | 6,600 mWh | | 2016-01-20 | 3,276 mWh | 6,600 mWh | | 2016-01-21 | 3,276 mWh | 6,600 mWh | | 2016-01-22 | 3,276 mWh | 6,600 mWh |

    This is not the original battery that came with my Dell XPS 1645. I originally had two 90mWh batteries, but both of those wore out. The current replacement was the only one I could find online (from a 3rd party – unfortunately Dell weren’t selling theirs anymore). I bought the 1645 back in 2010, so it will turn 6 in April – that’s not a bad effort for a laptop that has been lugged around a fair bit.

    And so my mind now turns to thinking about getting a replacement laptop…

    My initial specs are:

    • Gen 6 i7 or Xeon CPU
    • Minimum 16GB RAM (Prefer 16 would not be the maximum)
    • Minimum 512GB SSD (Ideally PCIe interface)
    • Decent screen resolution
    • Lighter than my 1645 (3.06KG/6.6lb according to the kitchen scales)
    • A bit smaller than the 1645 (380x260mm)

    Possible options:

    Let me know if you have any other suggestions or recommendations?

  • Upcoming Developer Events

    There’s been a few announcements lately that will interest you if you’re a developer:

    Know it. Prove it

    Microsoft Virtual Academy are running their “Know it. Prove it” challenge again during the month of February. It’s a chance for you to focus on learning something new in one of up to 10 ‘learning challenge’ areas. Register at the site to track your progress towards completing one (ore more) of the challenges and also earn some TechReward points (which you can redeem for actual stuff).

    Executable Specifications in .NET with Storyteller 3

    Next week JetBrains are hosting a webinar from Jeremy Miller on Storyteller, a tool for creating executable specifications in .NET. As well as creating Storyteller, you might also recognise Jeremy as the author of StructureMap. Register here to watch it live. Hopefully a recording will appear on the JetBrainsTV YouTube channel at a later date, as it turns out to be 1.30am in my time zone.

    hack.summit()

    Pluralsight are running hack.summit() a 4 day virtual developer conference, February 22-25. Speakers include well-known names such as Jon Skeet, Kent Beck, Joel Spolsky, Bob Martin and Yehuda katz. Register via the website – the cost is a donation to charity OR sharing the event on Twitter or Facebook.

    DDD Melbourne 7

    The date has been fixed for this year’s DDD Melbourne – Saturday, August 13th. That’s a week and a bit after NDC Sydney, if you were wondering. Speaking of Sydney, looks like they’ll also be hosting a DDD there sometime this year too (no date announced yet).