public void PrecompileApplication(ClientBuildManagerCallback callback, bool forceCleanBuild)
        {
            Debug.Trace("CBM", "PrecompileApplication");

            PrecompilationFlags savedFlags = _hostingParameters.ClientBuildManagerParameter.PrecompilationFlags;

            if (forceCleanBuild)
            {
                // If there was a previous host, it will be unloaded by CBM and we will wait for the callback.
                // If there was no previous host, we don't do any waiting.
                // DevDiv 46290
                _waitForCallBack = _host != null;

                Debug.Trace("CBM", "Started Unload");
                // Unload the existing appdomain so the new one will be created with the clean flag
                Unload();

                _hostingParameters.ClientBuildManagerParameter.PrecompilationFlags =
                    savedFlags | PrecompilationFlags.Clean;

                WaitForCallBack();
            }

            try {
                EnsureHostCreated();
                _host.PrecompileApp(callback, _hostingParameters.ClientBuildManagerParameter.ExcludedVirtualPaths);
            }
            finally {
                if (forceCleanBuild)
                {
                    // Revert precompilationFlags
                    _hostingParameters.ClientBuildManagerParameter.PrecompilationFlags = savedFlags;
                }
                // DevDiv 180798. We are returning null in ClientBuildManagerCallback.InitializeLifetimeService,
                // so we need to manually disconnect the instance so that it will be released.
                if (callback != null)
                {
                    RemotingServices.Disconnect(callback);
                }
            }
        }