测试代码
using System;
using System.Diagnostics;namespace ConsoleApp1
{public class TestClass{[Conditional("Debug1")]public static void Func1(){Console.WriteLine("Conditional 宏");}public static void Func2(){
#if Debug2Console.WriteLine("#if 宏");
#endif}}class Hello{static void Main(string[] args){TestClass.Func1();TestClass.Func2();Console.ReadKey();}}
}
生成DLL,使用ILSpy打开,可以看到:
使用#if 包住的代码直接被预处理去掉了,而使用Conditional的代码带着属性被保留了下来
这里因为两个宏都没添加到编译宏里,所以,可以看到本程序集调用Func1的代码被预编译去掉了。
新增一个工程,切依赖前面的工程
using ConsoleApp1;
using System;namespace ConsoleApp2
{class Program{static void Main(string[] args){TestClass.Func1();TestClass.Func2();}}
}
同样使用ILSpy查看:
可以看到ConsoleApp2调用Func1的代码被预编译去掉了
结论:
1. 使用#if 包的代码,如果本程序集没定义该宏,则在预编译阶段直接去掉
2.使用Conditional属性的函数,在调用的程序集如果没定义,则会去掉该函数的调用,但是代码是存在的