PageRenderTime 47ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/SolutionFramework/ControlProviders/ToolboxInstaller/Microsoft/VisualStudio/IDE/ToolboxControlsInstaller/XamlAssembly.cs

#
C# | 346 lines | 278 code | 20 blank | 48 comment | 50 complexity | 272816eed477ab579e1d5c8bdf272a4f MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0
  1. namespace Microsoft.VisualStudio.IDE.ToolboxControlsInstaller
  2. {
  3. using Microsoft.VisualStudio;
  4. using Microsoft.VisualStudio.OLE.Interop;
  5. using Microsoft.VisualStudio.Shell;
  6. using Microsoft.VisualStudio.Shell.Interop;
  7. using Microsoft.Win32;
  8. using Microsoft.Windows.Design;
  9. using Microsoft.Windows.Design.Host;
  10. using Microsoft.Windows.Design.Interaction;
  11. using Microsoft.Windows.Design.Metadata;
  12. //using Microsoft.Windows.Design.Metadata.Reflection;
  13. using MS.Internal.Package;
  14. using System;
  15. using System.Collections;
  16. using System.Collections.Generic;
  17. using System.Drawing;
  18. using System.Globalization;
  19. using System.IO;
  20. using System.Reflection;
  21. using System.Runtime.InteropServices;
  22. using System.Runtime.Versioning;
  23. using System.Windows;
  24. using System.Windows.Forms;
  25. internal abstract class XamlAssembly : RegisteredAssembly
  26. {
  27. private static IsolationProvider _lastIsolationProvider;
  28. private static FrameworkName _lastTargetFrameworkName;
  29. private const string TabProperty = "VSTOOLBOXTAB";
  30. public XamlAssembly(AssemblyName assemblyName) : base(assemblyName)
  31. {
  32. }
  33. public override bool AddItemsToToolbox(System.IServiceProvider provider, RegistryKey applicationRegistryRoot)
  34. {
  35. bool flag = false;
  36. IVsActivityLog service = provider.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
  37. service.LogEntry(3, this.ToString(), "Toolbox Controls Installer Package attempting to add Toolbox items");
  38. service.LogEntry(3, this.ToString(), string.Format(CultureInfo.CurrentCulture, "Attempting to get Toolbox items from Assembly {0}", new object[] { base.AssemblyName.FullName }));
  39. provider.GetService(typeof(Microsoft.VisualStudio.Shell.Interop.SVsFrameworkMultiTargeting));
  40. IQueryToolboxItems items = (IQueryToolboxItems) this.GetIsolationProvider(provider).CreateRemoteInstance(typeof(IsolationProxy));
  41. ICollection is2 = null;
  42. try
  43. {
  44. is2 = items.GetToolboxItems(base.AssemblyName, this.FrameworkElementAssemblySpec, new ArrayList(this.ExclusionList.ToArray()));
  45. }
  46. catch (Exception exception)
  47. {
  48. service.LogEntry(1, this.ToString(), string.Format(CultureInfo.CurrentCulture, "Assembly {0} threw exception {1} when attempting to enumerate Types.", new object[] { base.AssemblyName.FullName, exception.ToString() }));
  49. }
  50. if ((is2 == null) || (is2.Count == 0))
  51. {
  52. service.LogEntry(2, this.ToString(), string.Format(CultureInfo.CurrentCulture, "Assembly {0} did not contain any WPF/SL toolbox items.", new object[] { base.AssemblyName.FullName }));
  53. return flag;
  54. }
  55. foreach (IDictionary dictionary in is2)
  56. {
  57. string typeName = dictionary["CreationTypeName"].ToString();
  58. string fullTypeName = base.ExtractFullTypeName(typeName);
  59. string str3 = base.ExtractShortTypeName(typeName);
  60. service.LogEntry(3, this.ToString(), string.Format(CultureInfo.CurrentCulture, "Attempting to add Toolbox item {0}", new object[] { fullTypeName }));
  61. string tabName = null;
  62. if (dictionary.Contains("VSTOOLBOXTAB"))
  63. {
  64. tabName = (string) dictionary["VSTOOLBOXTAB"];
  65. dictionary.Remove("VSTOOLBOXTAB");
  66. }
  67. byte[] buffer = ToolEncoder.Encode(dictionary);
  68. OleDataObject dataObj = new OleDataObject();
  69. dataObj.SetData(System.Windows.DataFormats.GetDataFormat(this.ClipFormat).Name, false, new MemoryStream(buffer));
  70. TBXITEMINFO itemInfo = new TBXITEMINFO();
  71. TBXITEMINFO itemInfoAll = new TBXITEMINFO();
  72. itemInfo.bstrText = str3;
  73. byte[] buffer2 = (byte[]) dictionary["Bitmap"];
  74. Bitmap bitmap = null;
  75. System.Drawing.Color black = System.Drawing.Color.Black;
  76. if (buffer2 != null)
  77. {
  78. bitmap = new Bitmap(new MemoryStream(buffer2));
  79. }
  80. else
  81. {
  82. bitmap = new Bitmap(typeof(XamlAssembly).Assembly.GetManifestResourceStream(typeof(XamlAssembly), "DefaultBitmap.bmp"));
  83. }
  84. itemInfoAll = itemInfo;
  85. if (bitmap != null)
  86. {
  87. if ((bitmap.Height > 0) && (bitmap.Width > 0))
  88. {
  89. black = bitmap.GetPixel(0, bitmap.Size.Height - 1);
  90. }
  91. if (black.A < 0xff)
  92. {
  93. black = System.Drawing.Color.FromArgb(0xff, black);
  94. }
  95. itemInfo.hBmp = ControlPaint.CreateHBitmap16Bit(bitmap, black);
  96. itemInfo.clrTransparent = (uint) ColorTranslator.ToWin32(black);
  97. itemInfo.dwFlags = 1;
  98. itemInfoAll.hBmp = ControlPaint.CreateHBitmap16Bit(bitmap, black);
  99. itemInfoAll.clrTransparent = (uint) ColorTranslator.ToWin32(black);
  100. itemInfoAll.dwFlags = 1;
  101. }
  102. if (this.AddToToolbox(provider, tabName, this.CreateControl(fullTypeName, dictionary), dataObj, itemInfo, itemInfoAll))
  103. {
  104. flag = true;
  105. }
  106. }
  107. return flag;
  108. }
  109. private bool AddToToolbox(System.IServiceProvider provider, string tabName, DictionaryControl control, Microsoft.VisualStudio.OLE.Interop.IDataObject dataObj, TBXITEMINFO itemInfo, TBXITEMINFO itemInfoAll)
  110. {
  111. if (dataObj is System.Windows.Forms.IDataObject)
  112. {
  113. dataObj = new SettableOleDataObject(dataObj as System.Windows.Forms.IDataObject);
  114. }
  115. provider.GetService(typeof(SVsActivityLog));
  116. string typeName = control.Properties["CreationTypeName"].ToString();
  117. string szValue = base.ExtractFullTypeName(typeName);
  118. base.ExtractShortTypeName(typeName);
  119. if (!string.IsNullOrEmpty(base.TargetFramework))
  120. {
  121. Microsoft.VisualStudio.Shell.Interop.IVsStringMap map;
  122. Microsoft.VisualStudio.Shell.Interop.IVsDataObjectStringMapManager manager = provider.GetService(typeof(Microsoft.VisualStudio.Shell.Interop.SVsDataObjectStringMapManager)) as Microsoft.VisualStudio.Shell.Interop.IVsDataObjectStringMapManager;
  123. manager.CreateStringMap(out map);
  124. map.SetValue("TypeName", szValue);
  125. map.SetValue("AssemblyName", base.AssemblyName.FullName);
  126. map.SetValue("Frameworks", base.TargetFramework);
  127. map.SetValue("ItemProvider", "{" + base.GetType().GUID.ToString() + "}");
  128. manager.WriteStringMap(dataObj, "MultiTargeting:{FBB22D27-7B21-42ac-88C8-595F94BDBCA5}", 1, map);
  129. }
  130. object service = provider.GetService(typeof(SVsToolbox));
  131. IVsToolbox2 toolbox = service as IVsToolbox2;
  132. IVsToolbox3 toolbox2 = service as IVsToolbox3;
  133. if (string.IsNullOrEmpty(tabName))
  134. {
  135. if (base.ToolboxItemCategories.ContainsKey(szValue))
  136. {
  137. tabName = base.ToolboxItemCategories[szValue];
  138. }
  139. else
  140. {
  141. tabName = base.DefaultCategory;
  142. }
  143. }
  144. int hr = 0;
  145. if (!string.IsNullOrEmpty(tabName))
  146. {
  147. if ((string.CompareOrdinal(tabName, "Common") == 0) && !ErrorHandler.Succeeded(toolbox2.GetTabOfID(this.InvariantCommonCategory, out tabName)))
  148. {
  149. tabName = null;
  150. }
  151. if (!string.IsNullOrEmpty(tabName))
  152. {
  153. TBXITEMINFO[] ptif = new TBXITEMINFO[] { itemInfo };
  154. hr = toolbox.AddItem(dataObj, ptif, tabName);
  155. }
  156. }
  157. if (!string.IsNullOrEmpty(this.InvariantAllItemsCategory))
  158. {
  159. if (!ErrorHandler.Succeeded(toolbox2.GetTabOfID(this.InvariantAllItemsCategory, out tabName)))
  160. {
  161. tabName = null;
  162. }
  163. if (!string.IsNullOrEmpty(tabName))
  164. {
  165. TBXITEMINFO[] tbxiteminfoArray2 = new TBXITEMINFO[] { itemInfoAll };
  166. hr = toolbox.AddItem(dataObj, tbxiteminfoArray2, tabName);
  167. }
  168. }
  169. if (ErrorHandler.Succeeded(hr))
  170. {
  171. base.RegisteredControls.Add(control);
  172. return true;
  173. }
  174. return false;
  175. }
  176. protected abstract DictionaryControl CreateControl(string fullTypeName, IDictionary toolProperties);
  177. private IsolationProvider GetIsolationProvider(System.IServiceProvider provider)
  178. {
  179. FrameworkName targetFramework = new FrameworkName(this.GetTargetIsolationFramework());
  180. if ((targetFramework != _lastTargetFrameworkName) || (_lastIsolationProvider == null))
  181. {
  182. IsolationProviderService service = provider.GetService(typeof(IsolationProviderService)) as IsolationProviderService;
  183. if (service == null)
  184. {
  185. throw new InvalidOperationException();
  186. }
  187. UnloadAppDomain();
  188. _lastIsolationProvider = service.CreateGlobalIsolationProvider(targetFramework);
  189. _lastTargetFrameworkName = targetFramework;
  190. }
  191. return _lastIsolationProvider;
  192. }
  193. private string GetTargetIsolationFramework()
  194. {
  195. return (base.TargetFramework ?? this.DefaultFramework);
  196. }
  197. public static void UnloadAppDomain()
  198. {
  199. if (_lastIsolationProvider != null)
  200. {
  201. _lastIsolationProvider.Dispose();
  202. _lastIsolationProvider = null;
  203. }
  204. _lastTargetFrameworkName = null;
  205. }
  206. protected abstract int ClipFormat { get; }
  207. protected abstract string DefaultFramework { get; }
  208. protected abstract List<string> ExclusionList { get; }
  209. protected abstract AssemblyName FrameworkElementAssemblySpec { get; }
  210. protected abstract string InvariantAllItemsCategory { get; }
  211. protected abstract string InvariantCommonCategory { get; }
  212. [ComVisible(true)]
  213. private class IsolationProxy : ICustomQueryInterface, IQueryToolboxItems
  214. {
  215. private IModifiableMetadataContext _metadataContext = (AppDomain.CurrentDomain.GetData(typeof(IMetadataContext).FullName) as IModifiableMetadataContext);
  216. private static Guid IID_IManagedObject = new Guid("{C3FCC19E-A970-11D2-8B5A-00A0C9B7C9C4}");
  217. //internal CreationTool GetCreationTool(ITypeMetadata controlTypeMeta)
  218. //{
  219. // ITypeMetadata attributeType = this._metadataContext.GetType(typeof(CreationToolAttribute));
  220. // System.Type runtimeType = controlTypeMeta.GetRuntimeType();
  221. // CreationTool tool = null;
  222. // foreach (IAttributeMetadata metadata2 in controlTypeMeta.GetAttributes(attributeType))
  223. // {
  224. // CreationToolAttribute attribute = (CreationToolAttribute) metadata2.GetValue();
  225. // if (attribute.ToolType != null)
  226. // {
  227. // tool = Activator.CreateInstance(attribute.ToolType) as CreationTool;
  228. // }
  229. // if (tool != null)
  230. // {
  231. // tool.CreationType = runtimeType;
  232. // }
  233. // return tool;
  234. // }
  235. // return tool;
  236. //}
  237. public CustomQueryInterfaceResult GetInterface(ref Guid iid, out IntPtr ppv)
  238. {
  239. ppv = IntPtr.Zero;
  240. if (iid.Equals(IID_IManagedObject))
  241. {
  242. return CustomQueryInterfaceResult.Failed;
  243. }
  244. return CustomQueryInterfaceResult.NotHandled;
  245. }
  246. public ICollection GetToolboxItems(AssemblyName assemblyName, AssemblyName feElementAssemblySpec, IList exclusionList)
  247. {
  248. if (this._metadataContext == null)
  249. {
  250. return null;
  251. }
  252. ArrayList list = new ArrayList();
  253. try
  254. {
  255. this._metadataContext.AssemblyNames.Add(assemblyName);
  256. IAssemblyMetadata assembly = this._metadataContext.GetAssembly(assemblyName.FullName);
  257. if (assembly == null)
  258. {
  259. return list;
  260. }
  261. IAssemblyMetadata metadata2 = null;
  262. foreach (IAssemblyMetadata metadata3 in this._metadataContext.Assemblies)
  263. {
  264. if (metadata3.Name.Equals(feElementAssemblySpec.Name, StringComparison.Ordinal))
  265. {
  266. metadata2 = metadata3;
  267. break;
  268. }
  269. }
  270. if (metadata2 == null)
  271. {
  272. return null;
  273. }
  274. ITypeMetadata type = metadata2.GetType(typeof(FrameworkElement).FullName);
  275. if (type == null)
  276. {
  277. return null;
  278. }
  279. foreach (ITypeMetadata metadata5 in assembly.Types)
  280. {
  281. if (((!exclusionList.Contains(metadata5.FullName) && type.IsAssignableFrom(metadata5)) && (!metadata5.IsAbstract && metadata5.IsVisible)) /* && !this.HiddenFromToolbox(metadata5) */)
  282. {
  283. //CreationTool creationTool = this.GetCreationTool(metadata5);
  284. //if (creationTool != null)
  285. //{
  286. // IDictionary toolProperties = ToolEncoder.GetToolProperties(creationTool);
  287. // toolProperties.Add("VSTOOLBOXTAB", this.GetToolboxTab(metadata5));
  288. // list.Add(toolProperties);
  289. //}
  290. }
  291. }
  292. }
  293. catch (Exception exception)
  294. {
  295. ReflectionTypeLoadException exception2 = exception as ReflectionTypeLoadException;
  296. if (exception2 != null)
  297. {
  298. throw new ReflectionTypeLoadException(null, exception2.LoaderExceptions, exception2.Message);
  299. }
  300. throw;
  301. }
  302. return list;
  303. }
  304. //internal string GetToolboxTab(ITypeMetadata controlTypeMeta)
  305. //{
  306. // ITypeMetadata type = this._metadataContext.GetType(typeof(ToolboxTabNameAttribute));
  307. // foreach (IAttributeMetadata metadata2 in controlTypeMeta.GetAttributes(type))
  308. // {
  309. // ToolboxTabNameAttribute attribute = (ToolboxTabNameAttribute) metadata2.GetValue();
  310. // return attribute.TabName;
  311. // }
  312. // return null;
  313. //}
  314. //internal bool HiddenFromToolbox(ITypeMetadata controlTypeMeta)
  315. //{
  316. // ITypeMetadata type = this._metadataContext.GetType(typeof(ToolboxBrowsableAttribute));
  317. // foreach (IAttributeMetadata metadata2 in controlTypeMeta.GetAttributes(type))
  318. // {
  319. // ToolboxBrowsableAttribute attribute = (ToolboxBrowsableAttribute) metadata2.GetValue();
  320. // return !attribute.Browsable;
  321. // }
  322. // return false;
  323. //}
  324. }
  325. }
  326. }