Know whether your assembly is Debug or Release

Sometimes, you want to know if your assembly is a Debug or Release build – like if you’re outputting assembly information for diagnostic purposes. But how do you know?

Well, the easiest way would be to use C# Preprocessor Directives to change what your application does:

bool isDebug = false;
#if (DEBUG)
isDebug = true;
#else
isDebug = false;
#endif

I know the else isn’t needed, but it’s to show the other condition too.

So, what is this magical value DEBUG? Well, it’s a preprocessor variable that is optionally added to your project at build time. By default, it’s true for Debug build, and not for Release builds. You can find it in the project settings:

You could also just put this information into the AssemblyInfo.cs file for your assembly with the same Preprocessor directives:

[assembly: AssemblyTitle("Example Assembly")]
#if (DEBUG)
    [assembly: AssemblyConfiguration("Debug")]
    [assembly: AssemblyProduct("Example Assembly (Debug)")]
#else
    [assembly: AssemblyConfiguration("Release")]
    [assembly: AssemblyProduct("Example Assembly (Release)")]
#endif

Here I’m using AssemblyProduct to show the version as this information is shown in Details tab of the file’s properties in Windows:

Okay, so we can have the solution compile differently for Release and Debug. What if we wanted to detect it for an assembly that we’d not compiled? Well, Scott Hanselman has answered this already, but he doesn’t really define what is meant by a Debug build? Dave Black goes into this in more detail – but in short, does ‘Debug’ mean you can attach a debugger, or that optimisation of the code is turned off? I agree with his opinion – most people are asking if the code is optimized.

So, based on their offerings, here is my code for determining if an assembly was build in ‘Debug’ mode or not:

public static bool IsAssemblyDebug(Assembly assm)
{
    bool IsDebug = false;
    object[] attributes = assm.GetCustomAttributes(typeof(DebuggableAttribute), false);
    if (attributes.Length > 0)
    {
        DebuggableAttribute d = (DebuggableAttribute)attributes[0];
        IsDebug = d.IsJITOptimizerDisabled;
    }
    return IsDebug;
}
Advertisements
Know whether your assembly is Debug or Release

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s