//would expect that PathCollection.FindObjectByID would do this, but it appears to throw an exception if not found
 private static bool ContainsID(IDTSPathCollectionXX paths, int ID)
 {
     foreach (IDTSPathXX path in paths)
     {
         if (path.ID == ID)
             return true;
     }
     return false;
 }
 private static IDTSPathXX GetPathForInput(IDTSInputXX input, IDTSPathCollectionXX paths)
 {
     foreach (IDTSPathXX path in paths)
     {
         if (path.EndPoint.ID == input.ID)
             return path;
     }
     return null;
 }
 private static IDTSComponentMetaDataXX[] GetUpstreamComponents(IDTSComponentMetaDataXX component, IDTSPathCollectionXX paths)
 {
     List<IDTSComponentMetaDataXX> componentsToReturn = new List<IDTSComponentMetaDataXX>();
     
     foreach (IDTSPathXX upstream in paths)
     {
         if (upstream.EndPoint.Component.ID == component.ID)
         {
             if (!componentsToReturn.Contains(upstream.StartPoint.Component))
             {
                 componentsToReturn.Add(upstream.StartPoint.Component);
                 componentsToReturn.AddRange(GetUpstreamComponents(upstream.StartPoint.Component, paths));
             }
         }
     }
     return componentsToReturn.ToArray();
 }
 //workaround to http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3161935&SiteID=1
 private static void RemovePath(IDTSPathXX path, IDTSPathCollectionXX paths, bool AllowDeleteStartPoint)
 {
     if (!AllowDeleteStartPoint && path.StartPoint.DeleteOutputOnPathDetached)
     {
         System.Diagnostics.Debug.WriteLine("path going to delete output after detached!");
         path.StartPoint.DeleteOutputOnPathDetached = false;
     }
     bool bSuccess = false;
     try
     {
         paths.RemoveObjectByID(path.ID);
         bSuccess = true;
     }
     catch (Exception ex)
     {
         System.Diagnostics.Debug.WriteLine("Caught error during RemovePath: " + ex.Message);
         if (!ContainsID(paths, path.ID))
             bSuccess = true;
     }
     if (!bSuccess) throw new Exception("Could not remove path");
 }