测试代码
using System;
using System.Diagnostics;
namespace ConsoleApp1
{
public class TestClass
{
[Conditional("Debug1")]
public static void Func1()
{
Console.WriteLine("Conditional 宏");
}
public static void Func2()
{
#if Debug2
Console.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属性的函数,在调用的程序集如果没定义,则会去掉该函数的调用,但是代码是存在的