⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 assemblytree.cs

📁 全功能c#编译器
💻 CS
📖 第 1 页 / 共 2 页
字号:
					if (attr.RefName.FullName == ((SA.SharpAssembly)node.Attribute).FullName) { // if yes, return
						node.EnsureVisible();
						SelectedNode = node;
						return;
					}
				}
			}
			try {
				AddAssembly(SA.SharpAssembly.Load(attr.RefName.FullName, System.IO.Path.GetDirectoryName(attr.Assembly.Location)));	
				OpenAssemblyByName(attr);
			} catch(Exception ex) {
				MessageBox.Show(String.Format(ress.GetString("ObjectBrowser.LoadError"), attr.RefName.Name, ex.Message), ress.GetString("Global.ErrorText"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			}
		}
		
		protected override void OnBeforeCollapse(TreeViewCancelEventArgs e)
		{
			base.OnBeforeCollapse(e);
			((AssemblyTreeNode)e.Node).OnCollapse();
		}
		
		protected override void OnBeforeExpand(TreeViewCancelEventArgs e)
		{
			base.OnBeforeExpand(e);
			
			AssemblyTreeNode rn = (AssemblyTreeNode)e.Node;
			if (!rn.Populated)
				rn.Populate(showPrivateTypes, showInternalTypes);
			
			if (e.Node is TypeNode) {
				TypeNode tn = e.Node as TypeNode;
				
				if (!tn.MembersPopulated)
					tn.PopulateMembers(showPrivateMembers, showInternalMembers, showSpecial);
			}
			
			((AssemblyTreeNode)e.Node).OnExpand();
		}
		
		protected override void OnMouseDown(MouseEventArgs ev)
		{
			base.OnMouseDown(ev);
			
			AssemblyTreeNode node = GetNodeAt(ev.X, ev.Y) as AssemblyTreeNode;
			if (node != null) {
				if (ev.Button == MouseButtons.Right) histback = true;
				SelectedNode = node;
				histback = false;
				mnuRemAsm.Visible   = (node.Type == NodeType.Assembly);
				mnuDisAsm.Visible   = (node.Type == NodeType.Assembly);
				mnuCopyTree.Visible = (node.Type == NodeType.Library);
				mnuSaveRes.Visible  = (node.Type == NodeType.Resource);
				mnuJump.Visible     = (node.Type == NodeType.Link);
				mnuOpenRef.Visible  = (node.Type == NodeType.Reference);
				selnode = node;
			} else {
				mnuRemAsm.Visible   = false;
				mnuDisAsm.Visible   = false;
				mnuCopyTree.Visible = false;
				mnuSaveRes.Visible  = false;
				mnuJump.Visible     = false;
				mnuOpenRef.Visible  = false;
				selnode = null;
			}
 			
		}
		
		public void LoadAssembly(object sender, EventArgs e)
		{
			using (SelectReferenceDialog selDialog = new SelectReferenceDialog(new TempProject())) {
				if (selDialog.ShowDialog() == DialogResult.OK) {
					
					foreach (ProjectReference refInfo in selDialog.ReferenceInformations) {
						if (refInfo.ReferenceType == ReferenceType.Typelib) continue;
						if (refInfo.ReferenceType == ReferenceType.Project) continue;
						
						if (!IsAssemblyLoaded(refInfo.GetReferencedFileName(null))) {
							try {
								LoadFile(refInfo.GetReferencedFileName(null));
							} catch (Exception) {}
						}
					}
				}
			}
		}

		void LoadStdAssemblies(object sender, EventArgs e)
		{
			_parent.LoadStdAssemblies();
		}

		void LoadRefAssemblies(object sender, EventArgs e)
		{
			_parent.LoadRefAssemblies();
		}
		/*
		void ShowPrivTypesEvt(object sender, EventArgs e)
		{
			showPrivateTypes = !showPrivateTypes;
			propSvc.SetProperty("ObjectBrowser.ShowPrivTypes", showPrivateTypes);
			mnuShowPrivTypes.Checked = showPrivateTypes;
			RePopulateTreeView();
		}

		void ShowIntTypesEvt(object sender, EventArgs e)
		{
			showInternalTypes = !showInternalTypes;
			propSvc.SetProperty("ObjectBrowser.ShowIntTypes", showInternalTypes);
			mnuShowIntTypes.Checked = showInternalTypes;			
			RePopulateTreeView();
		}

		void ShowPrivMemEvt(object sender, EventArgs e)
		{
			showPrivateMembers = !showPrivateMembers;
			propSvc.SetProperty("ObjectBrowser.ShowPrivMembers", showPrivateMembers);
			mnuShowPrivMem.Checked = showPrivateMembers;			
			RePopulateTreeView();
		}
		
		void ShowIntMemEvt(object sender, EventArgs e)
		{
			showInternalMembers = !showInternalMembers;
			propSvc.SetProperty("ObjectBrowser.ShowIntMembers", showInternalMembers);
			mnuShowIntMem.Checked = showInternalMembers;			
			RePopulateTreeView();
		}
				
		void ShowSpecialEvt(object sender, EventArgs e)
		{
			showSpecial = !showSpecial;
			propSvc.SetProperty("ObjectBrowser.ShowSpecialMethods", showSpecial);
			mnuShowSpecial.Checked = showSpecial;			
			RePopulateTreeView();
		}
		*/
		
		public void RemoveAssembly(object sender, EventArgs e)
		{
			if (selnode == null) return;
			if (selnode.Type != NodeType.Assembly) return;
			
			assemblies.Remove((SA.SharpAssembly)selnode.Attribute);
			selnode.Remove();
		}
		
		public void CopyAssemblyTree(object sender, EventArgs e)
		{
			if (selnode == null) return;
			if (selnode.Type != NodeType.Library) return;
			
			StringBuilder stb = new StringBuilder();
			
			stb.Append(selnode.Text + "\n");
			GetSubNodeText(selnode, stb, 1);
			
			Clipboard.SetDataObject(stb.ToString(), true);
			
		}
		
		private static void GetSubNodeText(TreeNode node, StringBuilder build, int indentLevel) {
			foreach (TreeNode tn in node.Nodes) {
				build.Append('\t', indentLevel);
				build.Append(tn.Text + "\n");
				GetSubNodeText(tn, build, indentLevel + 1);
			}
		}
		
		FileUtilityService fileUtilityService = (FileUtilityService)ServiceManager.Services.GetService(typeof(FileUtilityService));

		public void DisAssembly(object sender, EventArgs e)
		{
			if (selnode == null) return;
			if (selnode.Type != NodeType.Assembly) return;
			
			SA.SharpAssembly asm = (SA.SharpAssembly)selnode.Attribute;
			
			SaveFileDialog sdialog 	= new SaveFileDialog();
			sdialog.AddExtension 	= true;			
			sdialog.FileName 		= asm.Name;
			sdialog.Filter          = "IL files (*.il)|*.il";
			sdialog.DefaultExt      = ".il";
			sdialog.InitialDirectory = Path.GetDirectoryName(asm.Location);

			DialogResult dr = sdialog.ShowDialog();
			sdialog.Dispose();
			if(dr != DialogResult.OK) return;
			
			try {
				string args = '"' + asm.Location + "\" /NOBAR /OUT=\"" + sdialog.FileName + "\" /ALL ";
                RegistryKey regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\.NETFramework");
                string cmd = (string)regKey.GetValue("sdkInstallRoot");
                if (cmd == null) cmd = (string)regKey.GetValue("sdkInstallRootv1.1");
                ProcessStartInfo psi = new ProcessStartInfo(fileUtilityService.GetDirectoryNameWithSeparator(cmd) +
                                                            "bin\\ildasm.exe", args);
				
				psi.RedirectStandardError  = true;
				psi.RedirectStandardOutput = true;
				psi.RedirectStandardInput  = true;
				psi.UseShellExecute        = false;
				psi.CreateNoWindow         = true;
				
				Process process = Process.Start(psi);
				string output   = process.StandardOutput.ReadToEnd();
				process.WaitForExit();
								
				MessageBox.Show(String.Format(ress.GetString("ObjectBrowser.ILDasmOutput"), output));
			} catch(Exception ex) {
				MessageBox.Show(String.Format(ress.GetString("ObjectBrowser.ILDasmError"),  ex.ToString()));
			}
		}
		
		public void SaveCurrentResource(object sender, EventArgs e)
		{
			if (selnode == null) return;
			if (selnode.Type != NodeType.Resource) return;
			
			SA.SharpAssembly asm = (SA.SharpAssembly)selnode.Attribute;
			SaveResource(asm, selnode.Text);
			
		}
		
		public void SaveResource(SA.SharpAssembly asm, string name)
		{
			SaveFileDialog sdialog 	= new SaveFileDialog();
			sdialog.AddExtension 	= true;			
			sdialog.FileName 		= name;
			sdialog.Filter          = ress.GetString("ObjectBrowser.Filters.Binary") + "|*.*";
			sdialog.DefaultExt      = ".bin";

			DialogResult dr = sdialog.ShowDialog();
			sdialog.Dispose();
			if(dr != DialogResult.OK) return;
			
			try {
				byte[] res = asm.GetManifestResource(name);
				FileStream fstr = new FileStream(sdialog.FileName, FileMode.Create);
				BinaryWriter wr = new BinaryWriter(fstr);
				wr.Write(res);
				fstr.Close();
			} catch {
			}
			
		}
		
		public void JumpLink(object sender, EventArgs e)
		{
			if (selnode == null) return;
			if (selnode.Type != NodeType.Link) return;
			
			OnDoubleClick(e);
		}
		
		public void OpenReference(object sender, EventArgs e)
		{
			if (selnode == null) return;
			if (selnode.Type != NodeType.Reference) return;
			
			OnDoubleClick(e);
		}
		
		void Back(object sender, EventArgs e)
		{
			if (history.Count == 0) return;
			try {
				histback = true;
				TreeNode selnode = (TreeNode)history.Pop();
				selnode.EnsureVisible();
				SelectedNode = selnode;
			} finally {
				histback = false;
			}
		}
		
		protected override void OnBeforeSelect(TreeViewCancelEventArgs ev)
		{
			base.OnBeforeSelect(ev);
			if (!histback) {
				// HACK : stack is cleared if too much elements
				if (history.Count >= 100) history.Clear();
				history.Push(SelectedNode);
			}
		}
		
		public void GoBack()
		{
			try {
				Back(mnuBack, new EventArgs());
			} catch {}
		}
		
		public class RefNodeAttribute
		{
			public SA.SharpAssembly     Assembly;
			public SA.SharpAssemblyName RefName;
			
			public RefNodeAttribute(SA.SharpAssembly asm, SA.SharpAssemblyName name)
			{
				Assembly = asm;
				RefName  = name;
			}
		}
		
		protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
		{
			base.OnMouseUp(e);
			
			if (e.Button == MouseButtons.XButton1) {
				GoBack();
			}
		}
		
	}

	public class TreeNodeComparer : IComparer
	{
		public int Compare(object x, object y)
		{
			return String.Compare(((TreeNode)x).Text, ((TreeNode)y).Text);
		}
	}
	
	public enum ShowOptions
	{
		Show = 0,
		GreyOut = 1,
		Hide = 2
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -