C#预编译宏并不像C++那样编译之后就不存在了。在UNITY的C#脚本中

#if UNITY_ANDROID && !UNITY_EDITOR
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("StartSpeeking");
Debug.Log("==========start===========================");
#endif

像上面这段脚本,我们对它所在的工程打包成APK, 不管#if成不成立,这段代码总是会打进APK中,然后在运行时,#if后的条件如果成立了那么便执行这段代码。

这根本不是预编译。在C/C++中的预编译则是在编译时直接根据条件把不符合的代码扔掉。如上面这段代码,若是C++,且#if后的条件不成立,那么这整段代码

都不会被编译进EXE中。

为什么C#会这样? 也许是因为C#编译成的APK或EXE或DLL只是中间语言,还需要经IL解释为汇编语言,然后再汇编成机器语言。在解释为汇编语言的过程中才进行像C/C++

那样的真正预编译。