public void Dispose()
 {
     if (projectInstance != null)
     {
         engine.DisposeProjectInstance(projectInstance);
         projectInstance = null;
         engine          = null;
     }
 }
        public void Evaluate()
        {
            object oldProjectInstance = null;

            if (projectInstance != null)
            {
                oldProjectInstance = projectInstance;
            }

            info = msproject.LoadNativeInstance(!OnlyEvaluateProperties);

            engine          = info.Engine;
            projectInstance = engine.CreateProjectInstance(info.Project);

            try {
                // Set properties defined by global property providers, and then
                // properties explicitly set to this instance

                foreach (var gpp in MSBuildProjectService.GlobalPropertyProviders)
                {
                    foreach (var prop in gpp.GetGlobalProperties())
                    {
                        engine.SetGlobalProperty(projectInstance, prop.Key, prop.Value);
                    }
                }
                foreach (var prop in globalProperties)
                {
                    engine.SetGlobalProperty(projectInstance, prop.Key, prop.Value);
                }

                engine.Evaluate(projectInstance, OnlyEvaluateProperties);

                SyncBuildProject(info.ItemMap, info.Engine, projectInstance);
            } catch (UserException ex) {
                LoggingService.LogError("MSBuild project could not be evaluated", ex);
                throw;
            } catch (Exception ex) {
                // If the project can't be evaluated don't crash
                LoggingService.LogError("MSBuild project could not be evaluated", ex);
                throw new ProjectEvaluationException(msproject, ex.Message);
            } finally {
                if (oldProjectInstance != null)
                {
                    engine.DisposeProjectInstance(oldProjectInstance);
                }
            }
        }