static bool UpgradeMonoGameProject(MonoDevelop.Core.IProgressMonitor monitor, MonoDevelop.Projects.SolutionEntityItem item, MSBuildProject project) { bool needsSave = false; bool containsMGCB = project.ItemGroups.Any(x => x.Items.Any(i => System.IO.Path.GetExtension(i.Include) == ".mgcb")); bool isMonoGame = project.PropertyGroups.Any(x => x.Properties.Any(p => p.Name == "MonoGamePlatform")) || project.ItemGroups.Any(x => x.Items.Any(i => i.Name == "Reference" && i.Include == "MonoGame.Framework")) || containsMGCB; bool isApplication = project.PropertyGroups.Any(x => x.Properties.Any(p => p.Name == "OutputType" && p.GetValue() == "Exe")) || project.PropertyGroups.Any(x => x.Properties.Any(p => p.Name == "AndroidApplication" && string.Compare(p.GetValue(), bool.TrueString, true) == 0)); bool isShared = project.PropertyGroups.Any(x => x.Properties.Any(p => p.Name == "HasSharedItems" && p.GetValue() == "true")); var type = item.GetType().Name; monitor.Log.WriteLine("Found {0}", type); var platform = Environment.OSVersion.Platform == PlatformID.Win32NT ? "Windows" : "DesktopGL"; var path = MonoGameExtensionsPath; switch (type) { case "XamarinIOSProject": platform = "iOS"; break; case "MonoDroidProject": platform = "Android"; break; case "XamMac2Project": case "MonoGameProject": platform = "DesktopGL"; break; case "XamMac": case "XamMacProject": platform = "DesktopGL"; // Xamarin.Mac Classic does not use MSBuild so we need to absolute path. path = MonoGameExtensionsAbsolutePath; break; case "MonoMac": case "MonoMacProject": platform = "MacOSX"; // Xamarin.Mac Classic does not use MSBuild so we need to absolute path. path = MonoGameExtensionsAbsolutePath; break; } monitor.Log.WriteLine("Platform = {0}", platform); monitor.Log.WriteLine("Path = {0}", path); monitor.Log.WriteLine("isMonoGame {0}", isMonoGame); if (isMonoGame) { var ritems = new List <MSBuildItem> (); foreach (var ig in project.ItemGroups) { foreach (var i in ig.Items.Where(x => x.Name == "Reference" && x.Include == "MonoGame.Framework")) { if (!i.HasMetadata("HintPath")) { monitor.Log.WriteLine("Fixing {0} to be MonoGameContentReference", i.Include); var a = ig.AddNewItem("Reference", i.Include); a.SetMetadata("HintPath", string.Format(path, platform, "MonoGame.Framework.dll")); ritems.Add(i); needsSave = true; } } foreach (var i in ig.Items.Where(x => x.Name == "Reference" && x.Include == "Tao.Sdl")) { if (!i.HasMetadata("HintPath")) { monitor.Log.WriteLine("Fixing {0} to be Tao.Sdl", i.Include); var a = ig.AddNewItem("Reference", i.Include); a.SetMetadata("HintPath", string.Format(path, platform, "Tao.Sdl.dll")); ritems.Add(i); needsSave = true; } } foreach (var i in ig.Items.Where(x => x.Name == "Reference" && x.Include.StartsWith("OpenTK") && (platform != "iOS" && platform != "Android"))) { if (!i.HasMetadata("HintPath")) { monitor.Log.WriteLine("Fixing {0} to be OpenTK", i.Include); var a = ig.AddNewItem("Reference", i.Include); a.SetMetadata("HintPath", string.Format(path, platform, "OpenTK.dll")); a.SetMetadata("SpecificVersion", "true"); ritems.Add(i); needsSave = true; } } foreach (var i in ig.Items.Where(x => x.Name == "Reference" && x.Include == "NVorbis")) { if (!i.HasMetadata("HintPath")) { monitor.Log.WriteLine("Fixing {0} to be NVorbis", i.Include); var a = ig.AddNewItem("Reference", i.Include); a.SetMetadata("HintPath", string.Format(path, platform, "NVorbis.dll")); ritems.Add(i); needsSave = true; } } } foreach (var a in ritems) { project.RemoveItem(a); } var dotNetProject = item as DotNetProject; if (dotNetProject != null && (type == "MonoMacProject" || type == "XamMacProject")) { var items = new List <ProjectReference> (); var newitems = new List <ProjectReference> (); foreach (var reference in dotNetProject.References) { if (reference.Reference == "MonoGame.Framework" && string.IsNullOrEmpty(reference.HintPath)) { items.Add(reference); newitems.Add(new ProjectReference(ReferenceType.Assembly, reference.Reference, string.Format(path, platform, "MonoGame.Framework.dll"))); } if (reference.Reference.StartsWith("OpenTK") && string.IsNullOrEmpty(reference.HintPath)) { items.Add(reference); newitems.Add(new ProjectReference(ReferenceType.Assembly, reference.Reference, string.Format(path, platform, "OpenTK.dll"))); } if (reference.Reference == "NVorbis" && string.IsNullOrEmpty(reference.HintPath)) { items.Add(reference); newitems.Add(new ProjectReference(ReferenceType.Assembly, reference.Reference, string.Format(path, platform, "NVorbis.dll"))); } if (reference.Reference == "Tao.Sdl" && string.IsNullOrEmpty(reference.HintPath)) { items.Add(reference); newitems.Add(new ProjectReference(ReferenceType.Assembly, reference.Reference, string.Format(path, platform, "Tao.Sdl.dll"))); } } dotNetProject.References.RemoveRange(items); dotNetProject.References.AddRange(newitems); } } if (isMonoGame && containsMGCB && (isApplication || isShared)) { if (!project.PropertyGroups.Any(x => x.Properties.Any(p => p.Name == "MonoGamePlatform")) && !isShared) { monitor.Log.WriteLine("Adding MonoGamePlatform", platform); project.PropertyGroups.First().SetPropertyValue("MonoGamePlatform", platform, true); needsSave = true; } if (!project.Imports.Any(x => x.Project.StartsWith(MonoGameCommonProps, StringComparison.OrdinalIgnoreCase)) && !isShared) { monitor.Log.WriteLine("Adding MonoGame.Common.props Import"); var e = project.Document.DocumentElement; var manager = new XmlNamespaceManager(new NameTable()); var schema = "http://schemas.microsoft.com/developer/msbuild/2003"; manager.AddNamespace("tns", schema); var import = project.Document.CreateElement("Import", schema); import.SetAttribute("Project", MonoGameCommonProps); import.SetAttribute("Condition", string.Format("Exists('{0}')", MonoGameCommonProps)); project.Document.DocumentElement.InsertBefore(import, project.Document.DocumentElement.FirstChild); needsSave = true; } if (containsMGCB) { var ritems = new List <MSBuildItem> (); foreach (var ig in project.ItemGroups) { foreach (var i in ig.Items.Where(x => System.IO.Path.GetExtension(x.Include) == ".mgcb")) { if (i.Name != "MonoGameContentReference" && i.Name == "None") { monitor.Log.WriteLine("Fixing {0} to be MonoGameContentReference", i.Include); ig.AddNewItem("MonoGameContentReference", i.Include); ritems.Add(i); needsSave = true; } } } foreach (var a in ritems) { project.RemoveItem(a); } } if (!project.Imports.Any(x => x.Project.StartsWith(MonoGameContentBuildTargets, StringComparison.OrdinalIgnoreCase)) && !isShared) { monitor.Log.WriteLine("Adding MonoGame Content Builder .targets"); project.AddNewImport(MonoGameContentBuildTargets); needsSave = true; } } return(needsSave); }