protected virtual ReferenceNode CreateReferenceNode(string referenceType, ProjectElement element) { ReferenceNode node = null; #if FALSE if (referenceType == ProjectFileConstants.COMReference) { node = this.CreateComReferenceNode(element); } else #endif if (referenceType == ProjectFileConstants.Reference) { node = this.CreateAssemblyReferenceNode(element); } else if (referenceType == ProjectFileConstants.ProjectReference) { node = this.CreateProjectReferenceNode(element); } return(node); }
/// <summary> /// Adds a reference to this container using the selector data structure to identify it. /// </summary> /// <param name="selectorData">data describing selected component</param> /// <returns>Reference in case of a valid reference node has been created. Otherwise null</returns> public ReferenceNode AddReferenceFromSelectorData(VSCOMPONENTSELECTORDATA selectorData) { //Make sure we can edit the project file if (!this.ProjectMgr.QueryEditProjectFile(false)) { throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); } //Create the reference node ReferenceNode node = null; try { node = CreateReferenceNode(selectorData); } catch (ArgumentException) { // Some selector data was not valid. } //Add the reference node to the project if we have a valid reference node if (node != null) { // This call will find if the reference is in the project and, in this case // will not add it again, so the parent node will not be set. node.AddReference(); if (null == node.Parent) { // The reference was not added, so we can not return this item because it // is not inside the project. return(null); } var added = onChildAdded; if (added != null) { onChildAdded(this, new HierarchyNodeEventArgs(node)); } } return(node); }
internal void FireChildRemoved(ReferenceNode referenceNode) { var removed = onChildRemoved; if (removed != null) { removed(this, new HierarchyNodeEventArgs(referenceNode)); } }
/// <summary> /// Creates an assemby or com reference node given a selector data. /// </summary> protected virtual ReferenceNode CreateFileComponent(VSCOMPONENTSELECTORDATA selectorData) { if (null == selectorData.bstrFile) { throw new ArgumentNullException("selectorData"); } // We have a path to a file, it could be anything // First see if it is a managed assembly bool tryToCreateAnAssemblyReference = true; if (File.Exists(selectorData.bstrFile)) { try { // We should not load the assembly in the current appdomain. // If we do not do it like that and we load the assembly in the current appdomain then the assembly cannot be unloaded again. // The following problems might arose in that case. // 1. Assume that a user is extending the MPF and his project is creating a managed assembly dll. // 2. The user opens VS and creates a project and builds it. // 3. Then the user opens VS creates another project and adds a reference to the previously built assembly. This will load the assembly in the appdomain had we been using Assembly.ReflectionOnlyLoadFrom. // 4. Then he goes back to the first project modifies it an builds it. A build error is issued that the assembly is used. // GetAssemblyName is assured not to load the assembly. tryToCreateAnAssemblyReference = (AssemblyName.GetAssemblyName(selectorData.bstrFile) != null); } catch (BadImageFormatException) { // We have found the file and it is not a .NET assembly; no need to try to // load it again. tryToCreateAnAssemblyReference = false; } catch (FileLoadException) { // We must still try to load from here because this exception is thrown if we want // to add the same assembly refererence from different locations. tryToCreateAnAssemblyReference = true; } } ReferenceNode node = null; if (tryToCreateAnAssemblyReference) { // This might be a candidate for an assembly reference node. Try to load it. // CreateAssemblyReferenceNode will suppress BadImageFormatException if the node cannot be created. node = this.CreateAssemblyReferenceNode(selectorData.bstrFile); } // If no node has been created try to create a com reference node. if (node == null) { if (!File.Exists(selectorData.bstrFile)) { return(null); } node = ProjectMgr.CreateReferenceNodeForFile(selectorData.bstrFile); } return(node); }
internal void FireChildAdded(ReferenceNode referenceNode) { var added = onChildAdded; if (added != null) { added(this, new HierarchyNodeEventArgs(referenceNode)); } }