#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

304 lines
12 KiB

// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Gui
{
public class GacReferencePanel : UserControl, IReferencePanel
{
class ColumnSorter : System.Collections.IComparer
{
private int column = 0;
bool asc = true;
public int CurrentColumn
{
get
{
return column;
}
set
{
if(column == value) asc = !asc;
else column = value;
}
}
public int Compare(object x, object y)
{
ListViewItem rowA = (ListViewItem)x;
ListViewItem rowB = (ListViewItem)y;
int result = String.Compare(rowA.SubItems[CurrentColumn].Text, rowB.SubItems[CurrentColumn].Text);
if(asc) return result;
else return result * -1;
}
}
protected ListView listView;
CheckBox chooseSpecificVersionCheckBox;
ISelectReferenceDialog selectDialog;
ColumnSorter sorter;
public GacReferencePanel(ISelectReferenceDialog selectDialog)
{
listView = new ListView();
sorter = new ColumnSorter();
listView.ListViewItemSorter = sorter;
this.selectDialog = selectDialog;
ColumnHeader referenceHeader = new ColumnHeader();
referenceHeader.Text = ResourceService.GetString("Dialog.SelectReferenceDialog.GacReferencePanel.ReferenceHeader");
referenceHeader.Width = 240;
listView.Columns.Add(referenceHeader);
listView.Sorting = SortOrder.Ascending;
ColumnHeader versionHeader = new ColumnHeader();
versionHeader.Text = ResourceService.GetString("Dialog.SelectReferenceDialog.GacReferencePanel.VersionHeader");
versionHeader.Width = 120;
listView.Columns.Add(versionHeader);
listView.View = View.Details;
listView.FullRowSelect = true;
listView.ItemActivate += delegate { AddReference(); };
listView.ColumnClick += new ColumnClickEventHandler(columnClick);
listView.Dock = DockStyle.Fill;
this.Dock = DockStyle.Fill;
this.Controls.Add(listView);
chooseSpecificVersionCheckBox = new CheckBox();
chooseSpecificVersionCheckBox.Dock = DockStyle.Top;
chooseSpecificVersionCheckBox.Text = StringParser.Parse("${res:Dialog.SelectReferenceDialog.GacReferencePanel.ChooseSpecificAssemblyVersion}");
this.Controls.Add(chooseSpecificVersionCheckBox);
chooseSpecificVersionCheckBox.CheckedChanged += delegate {
listView.Items.Clear();
if (chooseSpecificVersionCheckBox.Checked)
listView.Items.AddRange(fullItemList);
else
listView.Items.AddRange(shortItemList);
};
PrintCache();
}
void columnClick(object sender, ColumnClickEventArgs e)
{
if(e.Column < 2) {
sorter.CurrentColumn = e.Column;
listView.Sort();
}
}
public void AddReference()
{
foreach (ListViewItem item in listView.SelectedItems) {
string include = chooseSpecificVersionCheckBox.Checked ? item.Tag.ToString() : item.Text;
ReferenceProjectItem rpi = new ReferenceProjectItem(selectDialog.ConfigureProject, include);
string requiredFrameworkVersion;
if (fullAssemblyNameToRequiredFrameworkVersionDictionary.TryGetValue(item.Tag.ToString(), out requiredFrameworkVersion)) {
rpi.SetMetadata("RequiredTargetFramework", requiredFrameworkVersion);
}
selectDialog.AddReference(
item.Text, "Gac", rpi.Include,
rpi
);
}
}
ListViewItem[] fullItemList;
/// <summary>
/// Item list where older versions are filtered out.
/// </summary>
ListViewItem[] shortItemList;
void PrintCache()
{
IList<DomAssemblyName> cacheContent = GetCacheContent();
List<ListViewItem> itemList = new List<ListViewItem>();
// Create full item list
foreach (DomAssemblyName asm in cacheContent) {
ListViewItem item = new ListViewItem(new string[] {asm.ShortName, asm.Version});
item.Tag = asm.FullName;
itemList.Add(item);
}
fullItemList = itemList.ToArray();
// Create short item list (without multiple versions)
itemList.Clear();
for (int i = 0; i < cacheContent.Count; i++) {
DomAssemblyName asm = cacheContent[i];
bool isDuplicate = false;
for (int j = 0; j < itemList.Count; j++) {
if (string.Equals(asm.ShortName, itemList[j].Text, StringComparison.OrdinalIgnoreCase)) {
itemList[j].SubItems[1].Text += "/" + asm.Version;
isDuplicate = true;
break;
}
}
if (!isDuplicate) {
ListViewItem item = new ListViewItem(new string[] {asm.ShortName, asm.Version});
item.Tag = asm.FullName;
itemList.Add(item);
}
}
shortItemList = itemList.ToArray();
listView.Items.AddRange(shortItemList);
Thread resolveVersionsThread = new Thread(ResolveVersionsWorker);
resolveVersionsThread.SetApartmentState(ApartmentState.STA);
resolveVersionsThread.IsBackground = true;
resolveVersionsThread.Name = "resolveVersionsThread";
resolveVersionsThread.Priority = ThreadPriority.BelowNormal;
resolveVersionsThread.Start();
}
void ResolveVersionsThread()
{
try {
ResolveVersionsWorker();
} catch (Exception ex) {
MessageService.ShowError(ex);
}
}
void ResolveVersionsWorker()
{
MSBuildBasedProject project = selectDialog.ConfigureProject as MSBuildBasedProject;
if (project == null)
return;
List<ListViewItem> itemsToResolveVersion = new List<ListViewItem>();
List<ReferenceProjectItem> referenceItems = new List<ReferenceProjectItem>();
WorkbenchSingleton.SafeThreadCall(
delegate {
foreach (ListViewItem item in shortItemList) {
if (item.SubItems[1].Text.Contains("/")) {
itemsToResolveVersion.Add(item);
referenceItems.Add(new ReferenceProjectItem(project, item.Text));
}
}
});
MSBuildInternals.ResolveAssemblyReferences(project, referenceItems.ToArray());
WorkbenchSingleton.SafeThreadAsyncCall(
delegate {
if (IsDisposed) return;
for (int i = 0; i < itemsToResolveVersion.Count; i++) {
if (referenceItems[i].Version != null) {
itemsToResolveVersion[i].SubItems[1].Text = referenceItems[i].Version.ToString();
}
}
});
}
readonly static Dictionary<string, string> fullAssemblyNameToRequiredFrameworkVersionDictionary = new Dictionary<string, string> {
{ "PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" },
{ "System.Printing, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" },
{ "Microsoft.Build.Conversion.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" },
{ "Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" },
{ "Microsoft.Build.Framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" },
{ "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" },
{ "Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" },
{ "Microsoft.VisualC.STLCLR, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" },
{ "policy.1.0.System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.5" },
{ "policy.1.0.System.Web.Extensions.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.5" },
{ "PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" },
{ "PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" },
{ "PresentationFramework.Classic, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" },
{ "PresentationFramework.Luna, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" },
{ "PresentationFramework.Royale, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" },
{ "PresentationUI, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" },
{ "ReachFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" },
{ "System.AddIn, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" },
{ "System.AddIn.Contract, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" },
{ "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" },
{ "System.Data.DataSetExtensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" },
{ "System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" },
{ "System.DirectoryServices.AccountManagement, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" },
{ "System.Management.Instrumentation, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" },
{ "System.Net, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "3.5" },
{ "System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.5" },
{ "System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.5" },
{ "System.Web.Extensions.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.5" },
{ "System.Windows.Presentation, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" },
{ "System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.5" },
{ "System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "3.5" },
{ "UIAutomationProvider, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" },
{ "UIAutomationTypes, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" },
{ "WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", "3.0" }
};
#if DEBUG
/// <summary>
/// run this method with a .net 3.5 project to generate the table above.
/// </summary>
void CreateReferenceToFrameworkTable()
{
MSBuildBasedProject project = selectDialog.ConfigureProject as MSBuildBasedProject;
if (project == null)
return;
var redistNameToRequiredFramework = new Dictionary<string, string> {
{ "Framework", null },
{ "Microsoft-Windows-CLRCoreComp", null },
{ "Microsoft.VisualStudio.Primary.Interop.Assemblies.8.0", null },
{ "Microsoft-WinFX-Runtime", "3.0" },
{ "Microsoft-Windows-CLRCoreComp-v3.5", "3.5" }
};
using (StreamWriter w = new StreamWriter("c:\\temp\\references.txt")) {
List<ReferenceProjectItem> referenceItems = new List<ReferenceProjectItem>();
WorkbenchSingleton.SafeThreadCall(
delegate {
foreach (ListViewItem item in fullItemList) {
referenceItems.Add(new ReferenceProjectItem(project, item.Tag.ToString()));
}
});
MSBuildInternals.ResolveAssemblyReferences(project, referenceItems.ToArray());
foreach (ReferenceProjectItem rpi in referenceItems) {
if (string.IsNullOrEmpty(rpi.Redist)) continue;
if (!redistNameToRequiredFramework.ContainsKey(rpi.Redist)) {
throw new Exception("unknown redist: " + rpi.Redist);
}
if (redistNameToRequiredFramework[rpi.Redist] != null) {
w.Write("\t\t\t{ \"");
w.Write(rpi.Include);
w.Write("\", \"");
w.Write(redistNameToRequiredFramework[rpi.Redist]);
w.WriteLine("\" },");
}
}
}
}
#endif
protected virtual IList<DomAssemblyName> GetCacheContent()
{
List<DomAssemblyName> list = GacInterop.GetAssemblyList();
list.RemoveAll(name => name.ShortName.ToLowerInvariant().EndsWith(".resources"));
return list;
}
}
}