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