/// <summary> /// Does the actual job of resolving an assembly reference. We need a private method that does not violate /// calling virtual method from the constructor. /// </summary> private void ResolveAssemblyReference() { if (this.ProjectMgr == null || this.ProjectMgr.IsClosed) { return; } var instance = this.ProjectMgr.ProjectInstance; BuildInstance(this.ProjectMgr, instance, MsBuildTarget.ResolveAssemblyReferences); IEnumerable <ProjectItemInstance> group = MSBuildProjectInstance.GetItems(instance, ProjectFileConstants.ReferencePath); if (group != null) { foreach (var item in group) { string fullPath = this.GetFullPathFromPath(MSBuildItem.GetEvaluatedInclude(item)); System.Reflection.AssemblyName name = System.Reflection.AssemblyName.GetAssemblyName(fullPath); // Try with full assembly name and then with weak assembly name. if (String.Compare(name.FullName, this.assemblyName.FullName, StringComparison.OrdinalIgnoreCase) == 0 || String.Compare(name.Name, this.assemblyName.Name, StringComparison.OrdinalIgnoreCase) == 0) { if (!NativeMethods.IsSamePath(fullPath, this.assemblyPath)) { // set the full path now. this.assemblyPath = fullPath; // We have a new item to listen too, since the assembly reference is resolved from a different place. this.fileChangeListener.ObserveItem(this.assemblyPath); } this.resolvedAssemblyName = name; // No hint path is needed since the assembly path will always be resolved. return; } } } }
/// <summary> /// Set an attribute on the project element /// </summary> /// <param name="attributeName">Name of the attribute to set</param> /// <param name="attributeValue">Value to give to the attribute</param> public void SetMetadata(string attributeName, string attributeValue) { Debug.Assert(String.Compare(attributeName, ProjectFileConstants.Include, StringComparison.OrdinalIgnoreCase) != 0, "Use rename as this won't work"); if (this.IsVirtual) { // For virtual node, use our virtual property collection if (virtualProperties.ContainsKey(attributeName)) { virtualProperties.Remove(attributeName); } virtualProperties.Add(attributeName, attributeValue); return; } // Build Action is the type, not a property, so intercept if (String.Compare(attributeName, ProjectFileConstants.BuildAction, StringComparison.OrdinalIgnoreCase) == 0) { item.ItemType = attributeValue; return; } // Check out the project file. if (!this.itemProject.QueryEditProjectFile(false)) { throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); } if (attributeValue == null) { item.RemoveMetadata(attributeName); } else { MSBuildItem.SetMetadataValue(item, attributeName, attributeValue); } itemProject.SetProjectFileDirty(true); }