/Microsoft.VisualStudio.IDE.ToolboxControlsInstaller/Microsoft/VisualStudio/IDE/ToolboxControlsInstaller/ToolboxInstallerPackage.cs
C# | 638 lines | 609 code | 28 blank | 1 comment | 88 complexity | c8f840702cad9faa7af1c7febd06d823 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0
- namespace Microsoft.VisualStudio.IDE.ToolboxControlsInstaller
- {
- using Microsoft.MetadataReader;
- using Microsoft.VisualStudio.OLE.Interop;
- using Microsoft.VisualStudio.Shell;
- using Microsoft.VisualStudio.Shell.Interop;
- using Microsoft.VisualStudio.Toolbox;
- using Microsoft.Win32;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Drawing.Design;
- using System.Globalization;
- using System.IO;
- using System.Linq;
- using System.Reflection;
- using System.Runtime.CompilerServices;
- using System.Runtime.InteropServices;
- using System.Runtime.Versioning;
- using System.Security.Cryptography;
- using System.Text;
- using System.Threading;
-
- //[ProvideToolboxItems(1), PackageRegistration(UseManagedResourcesOnly=true), Guid("2C298B35-07DA-45f1-96A3-BE55D91C8D7A"), DefaultRegistryRoot("9.0Exp")]
- public class ToolboxInstallerPackage : Package, IVsToolboxDataProvider
- {
- private List<RegisteredAssembly> _cachedAssemblies;
- private List<RegisteredAssembly> _registeredAssemblies;
- private static readonly int _silverlightFormat = DataFormats.GetDataFormat("CF_WINFXSILVERLIGHT_TOOL").Id;
- private const string _silverlightFormatString = "CF_WINFXSILVERLIGHT_TOOL";
- private const string DefaultCategory = "General";
- private const string DefaultWPFOrSilverlightCategory = "All Controls";
- private static SHA512 hashAlgorithm = SHA512.Create();
- private const string RegKey_Toolbox = "Toolbox";
- private const string ToolboxControlsInstaller = "ToolboxControlsInstaller";
- private const string ToolboxControlsInstallerCache = "ToolboxControlsInstallerCache";
- private const string ValueName_RegistryHash = "RegistryHash";
-
- public ToolboxInstallerPackage()
- {
- base.ToolboxInitialized += new EventHandler(this.PackageToolbox_ToolboxInitialized);
- base.ToolboxUpgraded += new EventHandler(this.PackageToolbox_ToolboxUpgraded);
- }
-
- private List<RegisteredAssembly> AddToolboxItems(List<RegisteredAssembly> assembliesToAddToToolbox)
- {
- if (assembliesToAddToToolbox.Count == 0)
- {
- return new List<RegisteredAssembly>();
- }
- List<RegisteredAssembly> list = new List<RegisteredAssembly>();
- IVsActivityLog log = base.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
- log.LogEntry(3, this.ToString(), "Toolbox Controls Installer Package attempting to add Toolbox items");
- IToolboxService service = (IToolboxService) base.GetService(typeof(IToolboxService));
- ToolboxService.UnloadToolboxItems();
- XamlAssembly.UnloadAppDomain();
- List<string> list2 = new List<string>();
- List<string> list3 = new List<string>();
- foreach (RegisteredAssembly assembly in assembliesToAddToToolbox)
- {
- bool flag = false;
- try
- {
- if (assembly is XamlAssembly)
- {
- try
- {
- if (list3.Contains(assembly.AssemblyName.Name))
- {
- XamlAssembly.UnloadAppDomain();
- list3.Clear();
- }
- list3.Add(assembly.AssemblyName.Name);
- flag = assembly.AddItemsToToolbox(this, base.ApplicationRegistryRoot);
- goto Label_03FF;
- }
- catch (InvalidOperationException)
- {
- log.LogEntry(2, this.ToString(), string.Format("Error adding toolbox items from assembly {0}. WPF toolbox items might not be supported by this version of Visual Studio.", assembly.AssemblyName.FullName));
- continue;
- }
- }
- log.LogEntry(3, this.ToString(), string.Format(CultureInfo.CurrentCulture, "Attempting to get Toolbox items from Assembly {0}", new object[] { assembly.AssemblyName.FullName }));
- if (list2.Contains(assembly.AssemblyName.Name))
- {
- ToolboxService.UnloadToolboxItems();
- list2.Clear();
- }
- list2.Add(assembly.AssemblyName.Name);
- ICollection toolboxItems = ToolboxService.GetToolboxItems(assembly.AssemblyName, true);
- if (toolboxItems.Count == 0)
- {
- log.LogEntry(2, this.ToString(), string.Format(CultureInfo.CurrentCulture, "Assembly {0} did not contain any toolbox items. Please go to documentation for ToolboxService.GetToolboxItems for a list of toolbox item requirements.", new object[] { assembly.AssemblyName.FullName }));
- }
- foreach (ToolboxItem item in toolboxItems)
- {
- log.LogEntry(3, this.ToString(), string.Format(CultureInfo.CurrentCulture, "Attempting to add Toolbox item {0}", new object[] { item.TypeName }));
- string defaultCategory = assembly.DefaultCategory;
- if (assembly.ToolboxItemCategories.ContainsKey(item.TypeName))
- {
- defaultCategory = assembly.ToolboxItemCategories[item.TypeName];
- }
- if (string.IsNullOrEmpty(defaultCategory))
- {
- log.LogEntry(2, this.ToString(), string.Format(CultureInfo.CurrentCulture, "No category set for toolbox item {0}. Consider setting a default category on the assembly registration or create a Categories key to specify per-item categories.", new object[] { item.TypeName }));
- defaultCategory = "General";
- }
- if (string.IsNullOrEmpty(assembly.TargetFramework))
- {
- service.AddToolboxItem(item, defaultCategory);
- }
- else
- {
- IVsToolboxService service2 = service as IVsToolboxService;
- FrameworkName name = null;
- try
- {
- name = new FrameworkName(assembly.TargetFramework);
- }
- catch (ArgumentException)
- {
- log.LogEntry(2, this.ToString(), string.Format(CultureInfo.CurrentCulture, "Invalid framework {0} specified for toolbox item {1}. The item will be added without multi-targeting metadata.", new object[] { assembly.TargetFramework, item.TypeName }));
- }
- if (name == null)
- {
- service.AddToolboxItem(item, defaultCategory);
- }
- else
- {
- service2.AddToolboxItem(item, defaultCategory, new FrameworkName[] { name }, base.GetType().GUID);
- }
- }
- flag = true;
- assembly.RegisteredControls.Add(new DotNetControl(item.TypeName, item.DisplayName, item.Description));
- }
- }
- catch (ArgumentException exception)
- {
- log.LogEntry(1, this.ToString(), string.Format(CultureInfo.CurrentCulture, "{0}. Did you remember to add this assembly to the GAC or add a string value named CodeBase?", new object[] { exception.Message }));
- }
- catch (FileNotFoundException exception2)
- {
- log.LogEntry(1, this.ToString(), exception2.Message);
- }
- catch (FileLoadException exception3)
- {
- log.LogEntry(1, this.ToString(), exception3.Message);
- }
- catch (BadImageFormatException exception4)
- {
- log.LogEntry(1, this.ToString(), exception4.Message);
- }
- Label_03FF:
- if (flag)
- {
- list.Add(assembly);
- }
- }
- ToolboxService.UnloadToolboxItems();
- XamlAssembly.UnloadAppDomain();
- return list;
- }
-
- private void AppendRegistryContents(RegistryKey root, StringBuilder result)
- {
- result.Append(root.Name.Split(new char[] { '\\' }).Last<string>());
- foreach (string str in root.GetValueNames())
- {
- result.Append(str);
- result.Append(root.GetValue(str).ToString());
- }
- foreach (string str2 in root.GetSubKeyNames())
- {
- this.AppendRegistryContents(root.OpenSubKey(str2), result);
- }
- }
-
- private void ClearCache()
- {
- try
- {
- base.UserRegistryRoot.DeleteSubKeyTree("ToolboxControlsInstallerCache");
- }
- catch (ArgumentException)
- {
- }
- }
-
- private RegisteredAssembly CreateRegisteredAssembly(RegistryKey key, string keyName)
- {
- if (!string.IsNullOrEmpty(key.GetValue("SilverlightControls") as string))
- {
- return new SilverlightAssembly(new AssemblyName(keyName));
- }
- if (!string.IsNullOrEmpty(key.GetValue("WPFControls") as string))
- {
- return new WPFAssembly(new AssemblyName(keyName));
- }
- return new DotNetAssembly(new AssemblyName(keyName));
- }
-
- private IEnumerable<AssemblyFolder> GetAllAssemblyFoldersEx()
- {
- Action<string> log = null;
- foreach (string iteratorVariable0 in this.GetInstalledFrameworks())
- {
- foreach (RegistryKey iteratorVariable1 in this.GetAssemblyFoldersExKeys(iteratorVariable0))
- {
- foreach (string iteratorVariable2 in iteratorVariable1.GetSubKeyNames())
- {
- using (RegistryKey iteratorVariable3 = iteratorVariable1.OpenSubKey(iteratorVariable2))
- {
- using (RegistryKey iteratorVariable4 = this.HighestServicePack(iteratorVariable3))
- {
- using (RegistryKey iteratorVariable5 = iteratorVariable4.OpenSubKey("Toolbox") ?? iteratorVariable3.OpenSubKey("Toolbox"))
- {
- if (iteratorVariable5 != null)
- {
- byte[] first = this.RegistryTreeHash(iteratorVariable3);
- CachedAssemblyFolder cache = CachedAssemblyFolder.GetCache(this.UserRegistryRoot, iteratorVariable3.Name);
- if ((cache != null) && first.SequenceEqual<byte>(cache.RegistryHash))
- {
- yield return cache;
- }
- else
- {
- if (log == null)
- {
- log = delegate (string errMsg) {
- (base.GetService(typeof(SVsActivityLog)) as IVsActivityLog).LogEntry(1, this.ToString(), errMsg);
- };
- }
- NonCachedAssemblyFolder iteratorVariable8 = new NonCachedAssemblyFolder(iteratorVariable0, iteratorVariable4.GetValue("") as string, iteratorVariable5.GetValue("TabName") as string, log);
- iteratorVariable8.Cache(this.UserRegistryRoot, iteratorVariable3.Name, first);
- yield return iteratorVariable8;
- }
- }
- }
- }
- }
- }
- }
- }
- }
-
- private IEnumerable<RegistryKey> GetAssemblyFoldersExKeys(string tfm)
- {
- return null; // new GetAssemblyFoldersExKeysd__25(-2) { <>4__this = this, <>3__tfm = tfm };
- }
-
- private List<RegisteredAssembly> GetCachedAssemblies()
- {
- if (this._cachedAssemblies == null)
- {
- this._cachedAssemblies = new List<RegisteredAssembly>();
- RegistryKey key = base.UserRegistryRoot.CreateSubKey("ToolboxControlsInstallerCache");
- foreach (string str in key.GetSubKeyNames())
- {
- RegisteredAssembly item = new RegisteredAssembly(new AssemblyName(str));
- this._cachedAssemblies.Add(item);
- RegistryKey key2 = key.OpenSubKey(str);
- item.RegistryHash = key2.GetValue("RegistryHash") as byte[];
- foreach (string str2 in key2.GetSubKeyNames())
- {
- RegistryKey key3 = key2.OpenSubKey(str2);
- if (key3.GetValue(SilverlightControl.StaticRegDescriptorValue) != null)
- {
- item.RegisteredControls.Add(new SilverlightControl(str2, this.GetRegValues(key3)));
- }
- else if (key3.GetValue(WPFControl.StaticRegDescriptorValue) != null)
- {
- item.RegisteredControls.Add(new WPFControl(str2, this.GetRegValues(key3)));
- }
- else
- {
- string displayName = key3.GetValue(null).ToString();
- string description = key3.GetValue("Description").ToString();
- item.RegisteredControls.Add(new DotNetControl(str2, displayName, description));
- }
- }
- }
- }
- return this._cachedAssemblies;
- }
-
- private IEnumerable<string> GetInstalledFrameworks()
- {
- Array prgSupportedFrameworks = null;
- (base.GetService(typeof(SVsFrameworkMultiTargeting)) as IVsFrameworkMultiTargeting).GetSupportedFrameworks(out prgSupportedFrameworks);
- return (from s in (string[]) prgSupportedFrameworks
- where string.IsNullOrEmpty(new FrameworkName(s).Profile)
- select s);
- }
-
- private List<RegisteredAssembly> GetRegisteredAssemblies()
- {
- if (this._registeredAssemblies == null)
- {
- this._registeredAssemblies = new List<RegisteredAssembly>();
- foreach (RegistryKey key2 in new List<RegistryKey> { base.UserRegistryRoot, base.ApplicationRegistryRoot })
- {
- RegistryKey key = key2.OpenSubKey("ToolboxControlsInstaller");
- if (key != null)
- {
- foreach (string str in key.GetSubKeyNames())
- {
- RegistryKey key3 = key.OpenSubKey(str);
- RegisteredAssembly item = this.CreateRegisteredAssembly(key3, str);
- item.AssemblyName.CodeBase = key3.GetValue("Codebase") as string;
- item.DefaultCategory = key3.GetValue("") as string;
- item.TargetFramework = key3.GetValue("TargetFramework") as string;
- item.RegistryHash = this.RegistryTreeHash(key3);
- RegistryKey key4 = key3.OpenSubKey("ItemCategories");
- if (key4 != null)
- {
- foreach (string str2 in key4.GetValueNames())
- {
- item.ToolboxItemCategories.Add(str2, key4.GetValue(str2).ToString());
- }
- }
- if (!this._registeredAssemblies.Contains(item))
- {
- this._registeredAssemblies.Add(item);
- }
- }
- }
- }
- foreach (AssemblyFolder folder in this.GetAllAssemblyFoldersEx())
- {
- foreach (RegisteredAssembly assembly2 in folder.GetAssemblies())
- {
- if (!this._registeredAssemblies.Contains(assembly2))
- {
- this._registeredAssemblies.Add(assembly2);
- }
- }
- }
- }
- return this._registeredAssemblies;
- }
-
- private List<RegisteredAssembly> GetRegisteredNotCachedAssemblies()
- {
- List<RegisteredAssembly> cachedAssemblies = this.GetCachedAssemblies();
- return (from registeredAssembly in this.GetRegisteredAssemblies()
- where !cachedAssemblies.Contains(registeredAssembly)
- select registeredAssembly).ToList<RegisteredAssembly>();
- }
-
- private IDictionary GetRegValues(RegistryKey key)
- {
- IDictionary dictionary = new Hashtable();
- foreach (string str in key.GetValueNames())
- {
- dictionary.Add(str, key.GetValue(str).ToString());
- }
- return dictionary;
- }
-
- private List<RegisteredAssembly> GetRemovedAssemblies()
- {
- List<RegisteredAssembly> registeredAssemblies = this.GetRegisteredAssemblies();
- return (from cachedAssembly in this.GetCachedAssemblies()
- where !registeredAssemblies.Contains(cachedAssembly)
- select cachedAssembly).ToList<RegisteredAssembly>();
- }
-
- private IEnumerable<IDataObject> GetToolboxDataObjects(IVsToolbox2 toolboxSvc)
- {
- new List<IDataObject>();
- IEnumToolboxItems pEnum = null;
- toolboxSvc.EnumItems(null, out pEnum);
- IDataObject[] rgelt = new IDataObject[1];
- uint pceltFetched = 0;
- pEnum.Reset();
- while (true)
- {
- if ((pEnum.Next(1, rgelt, out pceltFetched) != 0) || (pceltFetched != 1))
- {
- yield break;
- }
- yield return rgelt[0];
- }
- }
-
- private static bool HasReference(Assembly assembly, string referenceName)
- {
- return assembly.GetReferencedAssemblies().Any<AssemblyName>(n => (string.Compare(n.Name, referenceName, StringComparison.OrdinalIgnoreCase) == 0));
- }
-
- private RegistryKey HighestServicePack(RegistryKey assemblyFolderKey)
- {
- foreach (string str in from s in assemblyFolderKey.GetSubKeyNames()
- orderby s descending
- select s)
- {
- if (str != "Toolbox")
- {
- RegistryKey key = assemblyFolderKey.OpenSubKey(str);
- if (!string.IsNullOrEmpty(key.GetValue("") as string))
- {
- return key;
- }
- }
- }
- return assemblyFolderKey;
- }
-
- int IVsToolboxDataProvider.FileDropped(string fileName, IVsHierarchy pHierSource, out int accepted)
- {
- accepted = 0;
- using (DefaultUniverse universe = new DefaultUniverse())
- {
- Assembly assembly = universe.LoadAssemblyFromFile(fileName);
- RegisteredAssembly assembly2 = null;
- if (HasReference(assembly, "PresentationFramework"))
- {
- assembly2 = new WPFAssembly(assembly.GetName());
- IVsTargetFrameworkAssemblies service = base.GetService(typeof(SVsTargetFrameworkAssemblies)) as IVsTargetFrameworkAssemblies;
- uint pTargetFrameworkVersion = 0;
- service.GetRequiredTargetFrameworkVersionFromDependency(fileName, out pTargetFrameworkVersion);
- if (pTargetFrameworkVersion != 0)
- {
- assembly2.TargetFramework = ".NETFramework,Version=v" + ((pTargetFrameworkVersion >> 0x10)).ToString() + "." + ((pTargetFrameworkVersion & 0xffff)).ToString();
- }
- }
- else if (HasReference(assembly, "System.Windows"))
- {
- assembly2 = new SilverlightAssembly(assembly.GetName());
- }
- if (assembly2 != null)
- {
- List<RegisteredAssembly> assembliesToAddToToolbox = new List<RegisteredAssembly> {
- assembly2
- };
- if (this.AddToolboxItems(assembliesToAddToToolbox).Count > 0)
- {
- accepted = 1;
- }
- }
- }
- return 0;
- }
-
- int IVsToolboxDataProvider.GetItemInfo(IDataObject pDO, TBXITEMINFO[] pItemInfo)
- {
- return -2147467263;
- }
-
- int IVsToolboxDataProvider.IsDataSupported(FORMATETC[] fetc, STGMEDIUM[] stg)
- {
- return -2147467263;
- }
-
- int IVsToolboxDataProvider.IsSupported(IDataObject pDO)
- {
- return -2147467263;
- }
-
- private void PackageToolbox_ToolboxInitialized(object sender, EventArgs e)
- {
- this.ClearCache();
- this.PackageToolbox_ToolboxUpgraded(sender, e);
- }
-
- private void PackageToolbox_ToolboxUpgraded(object sender, EventArgs e)
- {
- if (this.RegistryUpdated())
- {
- List<RegisteredAssembly> registeredNotCachedAssemblies = this.GetRegisteredNotCachedAssemblies();
- List<RegisteredAssembly> removedAssemblies = this.GetRemovedAssemblies();
- this.RemoveToolboxItems(removedAssemblies);
- List<RegisteredAssembly> installedAssemblies = this.AddToolboxItems(registeredNotCachedAssemblies);
- this.UpdateCache(installedAssemblies, removedAssemblies);
- }
- }
-
- private byte[] RegistryTreeHash(RegistryKey root)
- {
- StringBuilder result = new StringBuilder();
- this.AppendRegistryContents(root, result);
- return hashAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(result.ToString()));
- }
-
- private bool RegistryUpdated()
- {
- byte[] first = new byte[0];
- using (RegistryKey key = base.UserRegistryRoot.OpenSubKey("ToolboxControlsInstallerCache"))
- {
- if (key != null)
- {
- byte[] buffer2 = key.GetValue("RegistryHash") as byte[];
- if (buffer2 != null)
- {
- first = buffer2;
- }
- }
- }
- StringBuilder result = new StringBuilder();
- foreach (RegistryKey key2 in new RegistryKey[] { base.ApplicationRegistryRoot, base.UserRegistryRoot })
- {
- using (RegistryKey key3 = key2.OpenSubKey("ToolboxControlsInstaller"))
- {
- if (key3 != null)
- {
- this.AppendRegistryContents(key3, result);
- }
- }
- }
- foreach (string str in this.GetInstalledFrameworks())
- {
- foreach (RegistryKey key4 in this.GetAssemblyFoldersExKeys(str))
- {
- this.AppendRegistryContents(key4, result);
- }
- }
- byte[] second = hashAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(result.ToString()));
- if (first.SequenceEqual<byte>(second))
- {
- return false;
- }
- using (RegistryKey key5 = base.UserRegistryRoot.CreateSubKey("ToolboxControlsInstallerCache"))
- {
- key5.SetValue("RegistryHash", second);
- }
- return true;
- }
-
- private void RemoveToolboxItems(List<RegisteredAssembly> assembliesWithComponentToRemove)
- {
- if (assembliesWithComponentToRemove.Count != 0)
- {
- List<ToolboxItem> list = new List<ToolboxItem>();
- List<IDataObject> list2 = new List<IDataObject>();
- IVsToolbox2 toolboxSvc = base.GetService(typeof(SVsToolbox)) as IVsToolbox2;
- IToolboxService service = (IToolboxService) base.GetService(typeof(IToolboxService));
- if ((service != null) && (toolboxSvc != null))
- {
- ToolboxItemCollection toolboxItems = null;
- foreach (RegisteredAssembly assembly in assembliesWithComponentToRemove)
- {
- foreach (RegisteredControl control in assembly.RegisteredControls)
- {
- DictionaryControl control2 = control as DictionaryControl;
- if (control2 != null)
- {
- foreach (IDataObject obj2 in this.GetToolboxDataObjects(toolboxSvc))
- {
- if (control2.IsEqualTo(obj2))
- {
- list2.Add(obj2);
- }
- }
- continue;
- }
- DotNetControl control3 = control as DotNetControl;
- if (control3 != null)
- {
- if (toolboxItems == null)
- {
- toolboxItems = service.GetToolboxItems();
- }
- foreach (ToolboxItem item in toolboxItems)
- {
- if (((item.TypeName == control3.TypeName) && (item.DisplayName == control3.DisplayName)) && (item.AssemblyName.FullName == assembly.AssemblyName.FullName))
- {
- list.Add(item);
- }
- }
- continue;
- }
- }
- }
- foreach (ToolboxItem item2 in list)
- {
- service.RemoveToolboxItem(item2);
- }
- foreach (IDataObject obj3 in list2)
- {
- toolboxSvc.RemoveItem(obj3);
- }
- }
- }
- }
-
- private void UpdateCache(List<RegisteredAssembly> installedAssemblies, List<RegisteredAssembly> uninstalledAssemblies)
- {
- RegistryKey key = base.UserRegistryRoot.CreateSubKey("ToolboxControlsInstallerCache");
- foreach (RegisteredAssembly assembly in uninstalledAssemblies)
- {
- try
- {
- key.DeleteSubKeyTree(assembly.AssemblyName.FullName);
- continue;
- }
- catch (ArgumentException)
- {
- continue;
- }
- }
- foreach (RegisteredAssembly assembly2 in installedAssemblies)
- {
- if (key.OpenSubKey(assembly2.AssemblyName.FullName) != null)
- {
- throw new ArgumentException("Assembly has to be uninstalled before it can be installed");
- }
- RegistryKey key2 = key.CreateSubKey(assembly2.AssemblyName.FullName);
- key2.SetValue("RegistryHash", assembly2.RegistryHash);
- foreach (RegisteredControl control in assembly2.RegisteredControls)
- {
- RegistryKey key3 = key2.CreateSubKey(control.TypeName);
- DictionaryControl control2 = control as DictionaryControl;
- if (control2 != null)
- {
- key3.SetValue("CreationAssemblyName", control2.Properties["CreationAssemblyName"], RegistryValueKind.String);
- key3.SetValue("CreationTypeName", control2.Properties["CreationTypeName"], RegistryValueKind.String);
- key3.SetValue("ToolTypeName", control2.Properties["ToolTypeName"], RegistryValueKind.String);
- }
- else
- {
- DotNetControl control3 = control as DotNetControl;
- if (control3 != null)
- {
- key3.SetValue(null, control3.DisplayName, RegistryValueKind.String);
- key3.SetValue("description", control3.Description, RegistryValueKind.String);
- }
- }
- if (!string.IsNullOrEmpty(control.RegDescriptorValue))
- {
- key3.SetValue(control.RegDescriptorValue, 1, RegistryValueKind.DWord);
- }
- }
- }
- }
- }
- }
-