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.
[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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With