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

📄 reflectiontree.cs

📁 全功能c#编译器
💻 CS
📖 第 1 页 / 共 2 页
字号:
					AssemblyName name = (AssemblyName)rn.Attribute;
					OpenAssemblyByName(name);
					break;
			}
		}
		
		public void OpenAssemblyByName(AssemblyName name)
		{
			foreach (ReflectionNode node in Nodes) {
				if (node.Type == ReflectionNodeType.Assembly) {
					if (name.FullName == ((Assembly)node.Attribute).FullName) { // if yes, return
						node.EnsureVisible();
						SelectedNode = node;
						return;
					}
				}
			}
			try {
				AddAssembly(Assembly.Load(name));	
				OpenAssemblyByName(name);
			} catch(Exception ex) {
				MessageBox.Show(String.Format(ress.GetString("ObjectBrowser.LoadError"), name.Name, ex.Message), ress.GetString("Global.ErrorText"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			}
		}
		
		protected override void OnBeforeCollapse(TreeViewCancelEventArgs e)
		{
			base.OnBeforeCollapse(e);
			((ReflectionNode)e.Node).OnCollapse();
		}
		
		protected override void OnBeforeExpand(TreeViewCancelEventArgs e)
		{
			base.OnBeforeExpand(e);
			
			ReflectionNode rn = (ReflectionNode)e.Node;
			if (!rn.Populated)
				rn.Populate(showPrivateTypes, showInternalTypes);
			
			if (e.Node is ReflectionTypeNode) {
				ReflectionTypeNode tn = e.Node as ReflectionTypeNode;
				
				if (!tn.MembersPopulated)
					tn.PopulateMembers(showPrivateMembers, showInternalMembers, showSpecial);
			}
			
			((ReflectionNode)e.Node).OnExpand();
		}
		
		protected override void OnMouseDown(MouseEventArgs ev)
		{
			base.OnMouseDown(ev);
			
			ReflectionNode node = GetNodeAt(ev.X, ev.Y) as ReflectionNode;
			if (node != null) {
				if (ev.Button == MouseButtons.Right) histback = true;
				SelectedNode = node;
				histback = false;
				mnuRemAsm.Visible   = (node.Type == ReflectionNodeType.Assembly);
				mnuDisAsm.Visible   = (node.Type == ReflectionNodeType.Assembly);
				mnuCopyTree.Visible = (node.Type == ReflectionNodeType.Library);
				mnuSaveRes.Visible  = (node.Type == ReflectionNodeType.Resource);
				mnuJump.Visible     = (node.Type == ReflectionNodeType.Link);
				mnuOpenRef.Visible  = (node.Type == ReflectionNodeType.Reference);
				selnode = node;
			} else {
				mnuRemAsm.Visible   = false;
				mnuDisAsm.Visible   = false;
				mnuCopyTree.Visible = false;
				mnuSaveRes.Visible  = false;
				mnuJump.Visible     = false;
				mnuOpenRef.Visible  = false;
				selnode = null;
			}
 			
		}
		
		void LoadAsmEvt(object sender, EventArgs e)
		{
			using (SelectReferenceDialog selDialog = new SelectReferenceDialog(new ObjectBrowser.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 LoadStdEvt(object sender, EventArgs e)
		{
			_parent.LoadStdAssemblies();
		}

		void LoadRefEvt(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();
		}
				
		void RemAsmEvt(object sender, EventArgs e)
		{
			if (selnode == null) return;
			
			assemblies.Remove((Assembly)selnode.Attribute);
			selnode.Remove();
		}
		
		void CopyTreeEvt(object sender, EventArgs e)
		{
			if (selnode == null) 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));

		void DisAsmEvt(object sender, EventArgs e)
		{
			if (selnode == null) return;
			
			Assembly asm = (Assembly)selnode.Attribute;
			
			SaveFileDialog sdialog 	= new SaveFileDialog();
			sdialog.AddExtension 	= true;			
			sdialog.FileName 		= asm.GetName().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");
                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()));
			}
		}
		
		void SaveResEvt(object sender, EventArgs e)
		{
			if (selnode == null) return;
			
			Assembly asm = (Assembly)selnode.Attribute;
			SaveResource(asm, selnode.Text);
			
		}
		
		public void SaveResource(Assembly 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 {
				Stream str = asm.GetManifestResourceStream(name);
				FileStream fstr = new FileStream(sdialog.FileName, FileMode.Create);
				BinaryWriter wr = new BinaryWriter(fstr);
				byte[] buf = new byte[str.Length];
				str.Read(buf, 0, (int)str.Length);
				wr.Write(buf);
				fstr.Close();
				str.Close();
			} catch {
			}
			
		}
		
		void JumpEvt(object sender, EventArgs e)
		{
			if (selnode == null) return;
			
			OnDoubleClick(e);
		}
		
		void OpenRefEvt(object sender, EventArgs e)
		{
			if (selnode == null) return;
			
			OnDoubleClick(e);
		}
		
		void BackEvt(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()
		{
			BackEvt(mnuBack, new EventArgs());
		}
	}

	public class TreeNodeComparer : IComparer
	{
		public int Compare(object x, object y)
		{
			return String.Compare(((TreeNode)x).Text, ((TreeNode)y).Text);
		}
	}
}

⌨️ 快捷键说明

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