Conditional Compilation Constants and ASP.NET
UPDATE: K. Scott Allen got to the root of the problem. It turns out it was an issue of precedence. Compiler options are not additive. Specifying options in @Page override those in web.config. Read his post to find out more.
Conditional compilation constants are pretty useful for targeting your application for a particular platform, environment, etc… For example, to have code that only executes in debug mode, you can define a conditional constant named DEBUG and then do this…
#if DEBUG //This code only runs when the app is compiled for debug Log.EverythingAboutTheMachine(); #endif
It’s not common knowledge to me that these constants work equally well in ASPX and ASCX files. At least it wasn’t common knowledge for me. For example:
<!-- Note the space between % and # --> <% #if DEBUG %> <h1>DEBUG Mode!!!</h1> <% #endif %>
The question is, where do you define these conditional constants for ASP.NET. The answer is, well it depends on whether you’re using a Website project or a Web Application project.
For a Web Site project, one option is to define it at the Page level like so…
<%@ Page CompilerOptions="/d:QUUX" %>
The nice thing about this approach is that the conditional compilation
works both in the ASPX file as well as in the
CodeFile, for ASP.NET
According to this
by K. Scott Allen,
you can also define conditional compilation constants in the Web.config
file using the
<system.codedom /> element (a direct child of the
<configuration /> element, but this didn’t work for me in either
website projects nor web application projects.
<system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" compilerOptions="/d:MY_CONSTANT" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=188.8.131.52, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </compilers> </system.codedom>
Unfortunately, these only seem to work in the code behind and not within ASPX files.
Here’s a grid based on my experiments that show when and where setting conditional compilation constants seem to work in ASP.NET.
|Web.config||Project Properties||Page Directive|
|Website Code File||No||n/a||Yes|
|Web Application Code File||No||Yes||No|
|ASPX, ASCX File||No||No||Yes|
In order to create this grid, I created a solution that includes both a Web Application project and a Website project and ran through all nine permutations. You can download the solution here if you’re interested.
It’s a bit confusing, but hopefully the above table clears things up
slightly. As for setting the conditional constants in
quite surprised that it didn’t work for me (yes, I set it to full trust)
and assume that I must’ve made a mistake somewhere. Hopefully someone
will download this solution and show me why it doesn’t work.