Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Conditional Compilation in Referenced Assemblies

I'm writing an assembly with some conditionally compiled members in it, e.g.:

[Conditional("DEBUG")]
public static void Log(string message) { /*...*/ }

And using it like so:

public void DoStuff() {
    Log("This will only appear on debug builds");
    /* ... Do stuff ... */
}

But when I give this assembly to someone to use in their project, I want them to be able to define whether or not DEBUG-conditional members are compiled.

If that's not possible (e.g. the methods are just completely removed at compile-time), then is there any way to package multiple 'configurations' of an assembly (e.g. maybe with [AssemblyConfiguration]) and select them according to the configuration of the referencing assembly?

Also: I'm not looking for suggestions to manually set the references in the .csproj file of the referencing assembly; I know I can do that, but it's tedious, and has to be done for every reference.

like image 613
Xenoprimate Avatar asked Oct 29 '14 15:10

Xenoprimate


2 Answers

[Conditional("DEBUG")] is exactly what you are looking for. MSDN explanation of that attribute says:

Indicates to compilers that a method call or attribute should be ignored unless a specified conditional compilation symbol is defined.

However, what that explanation (as well as many others) fails to mention is that compilation symbol in question needs to be defined in the referencing assembly. In other words, if Assembly A contains method

[Conditional("DEBUG")]
public static void SomeMethod()
{ /* ... */ }

and you compile that assembly as Release, then SomeMethod will get called from Assembly B as long as that assembly is compiled as Debug.

like image 177
Tonci Avatar answered Sep 22 '22 05:09

Tonci


The methods will be compiled into assembly independently of the defined values, so you can use the methods, and method usage will depend on the compiler defines when compiling the client assembly.

In other words, System.Diagnostics.ConditionalAttribute instructs the compiler that the METHOD CALL should be ignored, not how the method is compiled.

like image 32
George Polevoy Avatar answered Sep 20 '22 05:09

George Polevoy