📄 reflectiontree.cs
字号:
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 + -