using System;

using System.Xml;

using System.IO;

 

namespace CopyProject

{

      /// <summary>

      /// Simple class which opens a project file, updates the GUIDs

      /// in it, and writes it out to a new name.  Copying a Visual Studio.NET

      /// project file without replacing the GUIDs will cause problems.

      /// Free for any use, author: Steve Tibbett (stevex-code@oakburl.net)

      /// </summary>

      class MainClass

      {

            /// <summary>

            /// The main entry point for the application.

            /// </summary>

            [STAThread]

            static void Main(string[] args)

            {

                  MainClass c = new MainClass();

                  c.Run(args);

            }

 

            // Create a new GUID string formatted the usual way.

            string NewGuidString()

            {

                  return "{" + System.Guid.NewGuid().ToString().ToUpper() + "}";

            }

 

            // This is the main entry point for the "object" that runs

            // this program; the Main entry point is static.

            void Run(string[] args)

            {

                  if (args.Length < 2)

                  {

                        Console.WriteLine("Please supply a source and destination file name (*.vcproj).");

                        return;

                  }

 

                  // Read the source file

                  XmlDocument doc = new XmlDocument();

                  try

                  {

                        // Load the existing project file.

                        doc.Load(args[0]);

                  }

                  catch (Exception ex)

                  {

                        // Oops

                        Console.WriteLine("Exception reading project file:");

                        Console.WriteLine(ex.Message);

                        return;

                  };

 

                  try

                  {

                        // Replace the ProjectGUID

                        XmlNode node = doc.SelectSingleNode("/VisualStudioProject");

                        node.Attributes["ProjectGUID"].Value = NewGuidString();

 

                        // Replace the UniqueIdentifier GUIDs in the Filter nodes

                        XmlNodeList nodes = doc.SelectNodes("//Filter");

                        foreach (XmlNode filterNode in nodes)

                        {

                              XmlAttribute attr = filterNode.Attributes["UniqueIndentifier"];

                              if (attr != null)

                              {

                                    attr.Value = NewGuidString();

                              };

                        }

                  }

                  catch (Exception ex)

                  {

                        Console.WriteLine("Error updating GUIDs:");

                        Console.WriteLine(ex.Message);

                        return;

                  }

 

                  try

                  {

                        // Write out the updated project file

                        doc.Save(args[1]);

                  }

                  catch (Exception ex)

                  {

                        Console.WriteLine("Error saving output file:");

                        Console.WriteLine(ex.Message);

                        return;

                  };

 

                  Console.WriteLine("Done!");

            }

      }

}