begin assembly language

主要参考这篇文章:Linux 汇编语言开发指南

 

1.汇编器

汇编器(assembler)的作用是将用汇编语言编写的源程序转换成二进制形式的目标代码。Linux 平台的标准汇编器是 GAS,它是 GCC 所依赖的后台汇编工具,通常包含在 binutils 软件包中。GAS 使用标准的 AT&T 汇编语法,可以用来汇编用 AT&T 格式编写的程序:

[xiaowp@gary code]$ as -o hello.o hello.s

 

Linux 平台上另一个经常用到的汇编器是 NASM,它提供了很好的宏指令功能,并能够支持相当多的目标代码格式,包括 bin、a.out、coff、elf、rdf 等。NASM 采用的是人工编写的语法分析器,因而执行速度要比 GAS 快很多,更重要的是它使用的是 Intel 汇编语法,可以用来编译用 Intel 语法格式编写的汇编程序:

[xiaowp@gary code]$ nasm -f elf hello.asm

 

2.链接器

由汇编器产生的目标代码是不能直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码。链接器通常用来将多个目标代码连接成一个可执行代码,这样可以先将整个程序分成几个模块来单独开发,然后才将它们组合(链接)成一个应用程序。 Linux 使用 ld 作为标准的链接程序,它同样也包含在 binutils 软件包中。汇编程序在成功通过 GAS 或 NASM 的编译并生成目标代码后,就可以使用 ld 将其链接成可执行程序了:

[xiaowp@gary code]$ ld -s -o hello hello.o


在64位机器上,上面的链接命令会报错,用下面这个:
ld -m elf_i386 -s -o hello hello.o


using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using DevExpress.Utils; using DevExpress.XtraBars; using DevExpress.XtraBars.Docking; using DevExpress.XtraBars.Docking2010; using DevExpress.XtraBars.Docking2010.Views; using DevExpress.XtraBars.Docking2010.Views.Tabbed; using DevExpress.XtraBars.Ribbon; using DevExpress.XtraEditors; using DevExpress.XtraSplashScreen; using EVUpperMacDX.Language; using EVUpperMacDX.Properties; using LeadChina.AssemblyLine.Business.Base; using LeadChina.AssemblyLine.DAL; using LeadChina.AssemblyLine.DAL.Helper; using LeadChina.AssemblyLine.DAL.Model; using LeadChina.AssemblyLine.DAL.Variable; using LeadChina.AssemblyLine.Model; using LeadChina.AssemblyLine.Model.UserMgr; using LeadChina.NETFramework.Common; namespace EVUpperMacDX.MainWindow { // Token: 0x02000038 RID: 56 public class MainForm : RibbonForm { // Token: 0x06000255 RID: 597 RVA: 0x0005D39C File Offset: 0x0005B59C public MainForm() { GlobalVariable.current_language = Thread.CurrentThread.CurrentCulture.Name; this.InitialAppSetting(); this.InitializeComponent(); this.BeginComponent(); Task.Run(delegate() { this.GetShift(); }); this.ComponentClear(); this.EndComponent(); } // Token: 0x06000256 RID: 598 RVA: 0x0005D428 File Offset: 0x0005B628 public void GetShift() { try { for (;;) { ShiftModel shift = this.baseBLL.GetShift(); GlobalVariable.Shift = ((shift != null) ? shift.ShiftName : null); Thread.Sleep(10000); } } catch (Exception e) { LogHelper.WriteLog("获取班次信息失败:", e); } } // Token: 0x06000257 RID: 599 RVA: 0x0005D488 File Offset: 0x0005B688 private void InitialAppSetting() { ConfigDAL configDAL = new ConfigDAL(DBType.MySql); bool flag = !configDAL.Exists("MES_DeviceNo"); if (flag) { configDAL.Add(new ConfigModel { AppConfigName = "MES_DeviceNo", AppConfigValue = "TestDeviceNo", ConfigCommon = "上报MES的设备编号" }); } bool flag2 = !configDAL.Exists("MES_LogSavePath"); if (flag2) { configDAL.Add(new ConfigModel { AppConfigName = "MES_LogSavePath", AppConfigValue = "D:/MESData/MES/SFC", ConfigCommon = "MES接口日志保存路径" }); } bool flag3 = !configDAL.Exists("LocalDataSavePath"); if (flag3) { configDAL.Add(new ConfigModel { AppConfigName = "LocalDataSavePath", AppConfigValue = "D:/tem", ConfigCommon = "本地临时保存文件" }); } bool flag4 = !configDAL.Exists("MES_DataSavePath"); if (flag4) { configDAL.Add(new ConfigModel { AppConfigName = "MES_DataSavePath", AppConfigValue = "D:/MESlog", ConfigCommon = "MES进出站数据保存路径" }); } bool flag5 = !configDAL.Exists("InIndex"); if (flag5) { configDAL.Add(new ConfigModel { AppConfigName = "InIndex", AppConfigValue = "0", ConfigCommon = "进站序号" }); } bool flag6 = !configDAL.Exists("OutIndex"); if (flag6) { configDAL.Add(new ConfigModel { AppConfigName = "OutIndex", AppConfigValue = "0", ConfigCommon = "出站序号" }); } ConfigModel model = configDAL.GetModel("MES_DeviceNo"); GlobalVariable.MES_DeviceNo = ((model != null) ? model.AppConfigValue : null); ConfigModel model2 = configDAL.GetModel("MES_LogSavePath"); GlobalVariable.MES_LogSavePath = ((model2 != null) ? model2.AppConfigValue : null); ConfigModel model3 = configDAL.GetModel("LocalDataSavePath"); GlobalVariable.LocalDataSavePath = ((model3 != null) ? model3.AppConfigValue : null); ConfigModel model4 = configDAL.GetModel("MES_DataSavePath"); GlobalVariable.MES_DataSavePath = ((model4 != null) ? model4.AppConfigValue : null); int InIndex = 0; ConfigModel model5 = configDAL.GetModel("InIndex"); int.TryParse((model5 != null) ? model5.AppConfigValue : null, out InIndex); GlobalVariable.InIndex = InIndex; int OutIndex = 0; ConfigModel model6 = configDAL.GetModel("OutIndex"); int.TryParse((model6 != null) ? model6.AppConfigValue : null, out OutIndex); GlobalVariable.OutIndex = OutIndex; } // Token: 0x06000258 RID: 600 RVA: 0x0005D704 File Offset: 0x0005B904 private void EndComponent() { ((ISupportInitialize)this.ribbonControl).EndInit(); this.dockPanel1_Container.ResumeLayout(false); ((ISupportInitialize)this.tabbedView).EndInit(); ((ISupportInitialize)this.documentManager1).EndInit(); base.ResumeLayout(false); base.PerformLayout(); } // Token: 0x06000259 RID: 601 RVA: 0x0005D754 File Offset: 0x0005B954 private void ComponentClear() { this.HomeNav.LinksPersistInfo.Clear(); this.SysSettingNav.LinksPersistInfo.Clear(); this.BasicInfoNav.LinksPersistInfo.Clear(); this.UserMgrNav.LinksPersistInfo.Clear(); } // Token: 0x0600025A RID: 602 RVA: 0x0005D7A8 File Offset: 0x0005B9A8 private void InitComponent() { this.HomeNav.LinksPersistInfo.Clear(); for (int i = 0; i <= this.tabbedView.Documents.Count - 1; i++) { bool flag = this.tabbedView.Documents[i].ControlName == "monitorDP"; if (!flag) { this.tabbedView.RemoveDocument(this.tabbedView.Documents[i].Control); } } string s = GlobalVariable.Account_ID; List<UserMenuModel> userMenuList = this.userMenuDal.GetModelByUserID(s); bool flag2 = userMenuList.Count <= 0; if (flag2) { XtraMessageBox.Show("该用户无任何操作权限。", "异常提示", MessageBoxButtons.OK, MessageBoxIcon.Hand); this.ComponentClear(); } else { for (int j = 0; j < userMenuList.Count; j++) { userMenuList[j].MenuName = MultiLanguage.Msg(userMenuList[j].MenuID); bool flag3 = userMenuList[j].MenuParentID == "M0001"; if (flag3) { BarButtonItem barButtonItem = new BarButtonItem(); UserMenuModel model = userMenuList[j]; string name = model.MenuName; barButtonItem.Caption = userMenuList[j].MenuName; barButtonItem.Tag = userMenuList[j].MenuFormTag; barButtonItem.ItemClick += this.barButtonNavigation_ItemClick; this.HomeNav.LinksPersistInfo.AddRange(new LinkPersistInfo[] { new LinkPersistInfo(barButtonItem) }); } bool flag4 = userMenuList[j].MenuParentID == "M0002"; if (flag4) { BarButtonItem barButtonItem2 = new BarButtonItem(); barButtonItem2.Caption = userMenuList[j].MenuName; barButtonItem2.Tag = userMenuList[j].MenuFormTag; barButtonItem2.ItemClick += this.barButtonNavigation_ItemClick; this.SysSettingNav.LinksPersistInfo.AddRange(new LinkPersistInfo[] { new LinkPersistInfo(barButtonItem2) }); } bool flag5 = userMenuList[j].MenuParentID == "M0003"; if (flag5) { BarButtonItem barButtonItem3 = new BarButtonItem(); barButtonItem3.Caption = userMenuList[j].MenuName; barButtonItem3.Tag = userMenuList[j].MenuFormTag; barButtonItem3.ItemClick += this.barButtonNavigation_ItemClick; this.BasicInfoNav.LinksPersistInfo.AddRange(new LinkPersistInfo[] { new LinkPersistInfo(barButtonItem3) }); } bool flag6 = userMenuList[j].MenuParentID == "M0006"; if (flag6) { BarButtonItem barButtonItem4 = new BarButtonItem(); barButtonItem4.Caption = userMenuList[j].MenuName; barButtonItem4.Tag = userMenuList[j].MenuFormTag; barButtonItem4.ItemClick += this.barButtonNavigation_ItemClick; this.UserMgrNav.LinksPersistInfo.AddRange(new LinkPersistInfo[] { new LinkPersistInfo(barButtonItem4) }); } } } } // Token: 0x0600025B RID: 603 RVA: 0x0005DAE9 File Offset: 0x0005BCE9 private void BeginComponent() { ((ISupportInitialize)this.ribbonControl).BeginInit(); this.dockPanel1_Container.SuspendLayout(); ((ISupportInitialize)this.tabbedView).BeginInit(); ((ISupportInitialize)this.documentManager1).BeginInit(); base.SuspendLayout(); } // Token: 0x0600025C RID: 604 RVA: 0x0005DB23 File Offset: 0x0005BD23 private void barButtonNavigation_ItemClick(object sender, ItemClickEventArgs e) { this.ChangePage(e); } // Token: 0x0600025D RID: 605 RVA: 0x0005DB30 File Offset: 0x0005BD30 private void ChangePage(ItemClickEventArgs e) { try { bool flag = e.Item == null; if (!flag) { foreach (BaseDocument baseDocument in ((IEnumerable<BaseDocument>)this.tabbedView.Documents)) { Document doc = (Document)baseDocument; bool flag2 = doc.Caption.ToString() == e.Item.Caption; if (flag2) { this.tabbedView.ActivateDocument(doc.Control); return; } } XtraUserControl control = this.CreateUserControl(e.Item.Caption, e.Item.Tag.ToString()); this.tabbedView.AddDocument(control); this.tabbedView.ActivateDocument(control); } } catch (Exception ex) { XtraMessageBox.Show(ex.ToString()); } } // Token: 0x0600025E RID: 606 RVA: 0x0005DC2C File Offset: 0x0005BE2C private void tabbedView_DocumentClosing(object sender, DocumentCancelEventArgs e) { this.GetControlsClosed(e.Document.Control); } // Token: 0x0600025F RID: 607 RVA: 0x0005DC44 File Offset: 0x0005BE44 private void GetControlsClosed(Control control) { Control.ControlCollection controls = control.Controls; foreach (object obj in controls) { Control item = (Control)obj; bool flag = item.Controls != null; if (flag) { bool flag2 = item is Form; if (flag2) { ((Form)item).Close(); ((Form)item).Dispose(); break; } this.GetControlsClosed(item); } } } // Token: 0x06000260 RID: 608 RVA: 0x0005DCE4 File Offset: 0x0005BEE4 private XtraUserControl CreateUserControl(string text, string formName) { XtraUserControl result; try { XtraUserControl control = new XtraUserControl(); control.Name = text.ToLower() + "UserControl"; control.Text = text; Assembly assembly = Assembly.GetExecutingAssembly(); Form form = (Form)assembly.CreateInstance(formName); form.FormBorderStyle = FormBorderStyle.None; form.Dock = DockStyle.Fill; form.TopLevel = false; form.Parent = control; form.Show(); result = control; } catch (Exception ex) { LogHelper.WriteLog("窗体加载异常:", ex); XtraMessageBox.Show(ex.ToString()); result = null; } return result; } // Token: 0x06000261 RID: 609 RVA: 0x0005DD88 File Offset: 0x0005BF88 private void MainForm_Load(object sender, EventArgs e) { try { this.ribbonControl.Minimized = true; MachineInfoModel machineInfo = this.machineDAL.GetModel(GlobalVariable.Machine_ID); bool flag = machineInfo == null; if (flag) { LogHelper.WriteLog("找不到对应的设备信息:" + GlobalVariable.Machine_ID); } this.Text = "<" + machineInfo.Description + ">上位机"; Assembly assembly = Assembly.GetExecutingAssembly(); Type pageType = assembly.GetExportedTypes().FirstOrDefault(delegate(Type obj) { string name = obj.Name; MachineInfoModel machineInfo2 = machineInfo; return name == ((machineInfo2 != null) ? machineInfo2.UIClassName : null); }); bool flag2 = null != pageType; if (flag2) { Form form = (Form)Activator.CreateInstance(pageType); form.FormBorderStyle = FormBorderStyle.None; form.TopLevel = false; form.Parent = this.monitorDP; form.Dock = DockStyle.Fill; form.Show(); MultiLanguage.LoadLanguage(this); } else { string str = "找不到指定的页面"; MachineInfoModel machineInfo3 = machineInfo; XtraMessageBox.Show(str + ((machineInfo3 != null) ? machineInfo3.UIClassName : null) + "!"); } } catch (Exception ex) { XtraMessageBox.Show(ex.ToString()); } } // Token: 0x06000262 RID: 610 RVA: 0x0005DED4 File Offset: 0x0005C0D4 private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { LogHelper.WriteLog("用户:" + GlobalVariable.Account_ID + "退出登陆!"); base.Dispose(); Environment.Exit(0); Application.Exit(); } // Token: 0x06000263 RID: 611 RVA: 0x0005DF08 File Offset: 0x0005C108 private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { bool flag = MessageBox.Show("确实要退出程序吗?", "退出程序", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel; if (flag) { e.Cancel = true; } } // Token: 0x06000264 RID: 612 RVA: 0x0005DF39 File Offset: 0x0005C139 private void monitorDP_Click(object sender, EventArgs e) { } // Token: 0x06000265 RID: 613 RVA: 0x0005DF3C File Offset: 0x0005C13C private void acount_ID_ItemClick(object sender, ItemClickEventArgs e) { LoginForm loginView = new LoginForm(); bool flag = loginView.ShowDialog() == DialogResult.Cancel; if (flag) { bool flag2 = loginView.flag; if (flag2) { this.acount_ID.Caption = GlobalVariable.Param1; loginView.Dispose(); } else { this.acount_ID.Caption = GlobalVariable.Account_ID; loginView.Dispose(); } } else { bool flag3 = loginView.flag; if (flag3) { this.acount_ID.Caption = GlobalVariable.Param1; bool flag4 = string.IsNullOrWhiteSpace(GlobalVariable.Param1); if (flag4) { loginView.Dispose(); } } else { this.acount_ID.Caption = GlobalVariable.Account_ID; bool flag5 = string.IsNullOrWhiteSpace(GlobalVariable.Account_ID); if (flag5) { loginView.Dispose(); } } this.BeginComponent(); this.InitComponent(); this.EndComponent(); } } // Token: 0x06000266 RID: 614 RVA: 0x0005E01C File Offset: 0x0005C21C protected override void Dispose(bool disposing) { bool flag = disposing && this.components != null; if (flag) { this.components.Dispose(); } base.Dispose(disposing); } // Token: 0x06000267 RID: 615 RVA: 0x0005E054 File Offset: 0x0005C254 private void InitializeComponent() { this.components = new Container(); SplashScreenManager splashScreenManager = new SplashScreenManager(this, typeof(SplashScreen1), true, true); DockingContainer dockingContainer = new DockingContainer(); ComponentResourceManager resources = new ComponentResourceManager(typeof(MainForm)); this.documentGroup1 = new DocumentGroup(this.components); this.document1 = new Document(this.components); this.tabbedView = new TabbedView(this.components); this.ribbonControl = new RibbonControl(); this.skinRibbonGalleryBarItem = new SkinRibbonGalleryBarItem(); this.HomeNav = new BarSubItem(); this.employeesBarButtonItem = new BarButtonItem(); this.customersBarButtonItem = new BarButtonItem(); this.barHeaderItem1 = new BarHeaderItem(); this.barHeaderItem2 = new BarHeaderItem(); this.acount_ID = new BarStaticItem(); this.SysSettingNav = new BarSubItem(); this.BasicInfoNav = new BarSubItem(); this.UserMgrNav = new BarSubItem(); this.ribbonPageHome = new RibbonPage(); this.ribbonPageGroupNavigation = new RibbonPageGroup(); this.ribbonPageGroup = new RibbonPageGroup(); this.ribbonPageSysSetting = new RibbonPage(); this.ribbonPageGroup1 = new RibbonPageGroup(); this.ribbonPageBaseSetting = new RibbonPage(); this.ribbonPageGroup2 = new RibbonPageGroup(); this.ribbonPageUserMgr = new RibbonPage(); this.ribbonPageGroup3 = new RibbonPageGroup(); this.ribbonStatusBar = new RibbonStatusBar(); this.dockManager1 = new DockManager(this.components); this.monitorDP = new DockPanel(); this.dockPanel1_Container = new ControlContainer(); this.documentManager1 = new DocumentManager(this.components); ((ISupportInitialize)this.documentGroup1).BeginInit(); ((ISupportInitialize)this.document1).BeginInit(); ((ISupportInitialize)this.tabbedView).BeginInit(); ((ISupportInitialize)this.ribbonControl).BeginInit(); ((ISupportInitialize)this.dockManager1).BeginInit(); this.monitorDP.SuspendLayout(); ((ISupportInitialize)this.documentManager1).BeginInit(); base.SuspendLayout(); splashScreenManager.ClosingDelay = 500; this.documentGroup1.Items.AddRange(new Document[] { this.document1 }); this.document1.Caption = "生产监控"; this.document1.ControlName = "monitorDP"; this.document1.FloatLocation = new Point?(new Point(730, 590)); this.document1.FloatSize = new Size?(new Size(200, 30)); this.document1.Properties.AllowClose = DefaultBoolean.False; this.document1.Properties.AllowFloat = DefaultBoolean.True; this.document1.Properties.AllowFloatOnDoubleClick = DefaultBoolean.True; this.tabbedView.DocumentGroups.AddRange(new DocumentGroup[] { this.documentGroup1 }); this.tabbedView.Documents.AddRange(new BaseDocument[] { this.document1 }); dockingContainer.Element = this.documentGroup1; this.tabbedView.RootContainer.Nodes.AddRange(new DockingContainer[] { dockingContainer }); this.tabbedView.DocumentClosing += this.tabbedView_DocumentClosing; this.ribbonControl.ExpandCollapseItem.Id = 0; this.ribbonControl.Items.AddRange(new BarItem[] { this.ribbonControl.ExpandCollapseItem, this.skinRibbonGalleryBarItem, this.HomeNav, this.employeesBarButtonItem, this.customersBarButtonItem, this.barHeaderItem1, this.barHeaderItem2, this.acount_ID, this.SysSettingNav, this.BasicInfoNav, this.UserMgrNav }); this.ribbonControl.Location = new Point(0, 0); this.ribbonControl.Margin = new Padding(5, 4, 5, 4); this.ribbonControl.MaxItemId = 52; this.ribbonControl.MdiMergeStyle = RibbonMdiMergeStyle.Always; this.ribbonControl.Name = "ribbonControl"; this.ribbonControl.PageHeaderItemLinks.Add(this.acount_ID); this.ribbonControl.Pages.AddRange(new RibbonPage[] { this.ribbonPageHome, this.ribbonPageSysSetting, this.ribbonPageBaseSetting, this.ribbonPageUserMgr }); this.ribbonControl.RibbonStyle = RibbonControlStyle.Office2013; this.ribbonControl.ShowApplicationButton = DefaultBoolean.False; this.ribbonControl.ShowToolbarCustomizeItem = false; this.ribbonControl.Size = new Size(1406, 198); this.ribbonControl.StatusBar = this.ribbonStatusBar; this.ribbonControl.Toolbar.ShowCustomizeItem = false; this.ribbonControl.ToolbarLocation = RibbonQuickAccessToolbarLocation.Hidden; this.skinRibbonGalleryBarItem.Id = 14; this.skinRibbonGalleryBarItem.Name = "skinRibbonGalleryBarItem"; this.HomeNav.Caption = "菜单"; this.HomeNav.Id = 15; this.HomeNav.ImageOptions.ImageUri.Uri = "NavigationBar"; this.HomeNav.Name = "HomeNav"; this.employeesBarButtonItem.Caption = "Employees"; this.employeesBarButtonItem.Id = 44; this.employeesBarButtonItem.Name = "employeesBarButtonItem"; this.employeesBarButtonItem.ItemClick += this.barButtonNavigation_ItemClick; this.customersBarButtonItem.Caption = "Customers"; this.customersBarButtonItem.Id = 45; this.customersBarButtonItem.Name = "customersBarButtonItem"; this.customersBarButtonItem.ItemClick += this.barButtonNavigation_ItemClick; this.barHeaderItem1.Caption = "版本号:"; this.barHeaderItem1.Id = 46; this.barHeaderItem1.Name = "barHeaderItem1"; this.barHeaderItem2.Caption = "V2.0.2020.11.27"; this.barHeaderItem2.Id = 47; this.barHeaderItem2.Name = "barHeaderItem2"; this.acount_ID.Caption = "游客(Guest)"; this.acount_ID.Id = 48; this.acount_ID.ImageOptions.Image = Resources.icon_customermanagement; this.acount_ID.Name = "acount_ID"; this.acount_ID.ItemClick += this.acount_ID_ItemClick; this.SysSettingNav.Caption = "菜单"; this.SysSettingNav.Id = 49; this.SysSettingNav.ImageOptions.ImageUri.Uri = "CustomizeGrid;Office2013"; this.SysSettingNav.Name = "SysSettingNav"; this.BasicInfoNav.Caption = "菜单"; this.BasicInfoNav.Id = 50; this.BasicInfoNav.ImageOptions.ImageUri.Uri = "Customization;Office2013"; this.BasicInfoNav.Name = "BasicInfoNav"; this.UserMgrNav.Caption = "菜单"; this.UserMgrNav.Id = 51; this.UserMgrNav.ImageOptions.Image = (Image)resources.GetObject("UserMgrNav.ImageOptions.Image"); this.UserMgrNav.ImageOptions.LargeImage = (Image)resources.GetObject("UserMgrNav.ImageOptions.LargeImage"); this.UserMgrNav.Name = "UserMgrNav"; this.ribbonPageHome.Groups.AddRange(new RibbonPageGroup[] { this.ribbonPageGroupNavigation, this.ribbonPageGroup }); this.ribbonPageHome.ImageOptions.ImageUri.Uri = "Home"; this.ribbonPageHome.Name = "ribbonPageHome"; this.ribbonPageHome.Text = "首页"; this.ribbonPageGroupNavigation.ItemLinks.Add(this.HomeNav); this.ribbonPageGroupNavigation.Name = "ribbonPageGroupNavigation"; this.ribbonPageGroup.AllowTextClipping = false; this.ribbonPageGroup.ItemLinks.Add(this.skinRibbonGalleryBarItem); this.ribbonPageGroup.Name = "ribbonPageGroup"; this.ribbonPageGroup.ShowCaptionButton = false; this.ribbonPageGroup.Text = "皮肤"; this.ribbonPageSysSetting.Groups.AddRange(new RibbonPageGroup[] { this.ribbonPageGroup1 }); this.ribbonPageSysSetting.ImageOptions.Image = (Image)resources.GetObject("ribbonPageSysSetting.ImageOptions.Image"); this.ribbonPageSysSetting.Name = "ribbonPageSysSetting"; this.ribbonPageSysSetting.Text = "系统设置"; this.ribbonPageGroup1.ImageOptions.ImageUri.Uri = "CustomizeGrid;Office2013"; this.ribbonPageGroup1.ItemLinks.Add(this.SysSettingNav); this.ribbonPageGroup1.Name = "ribbonPageGroup1"; this.ribbonPageBaseSetting.Groups.AddRange(new RibbonPageGroup[] { this.ribbonPageGroup2 }); this.ribbonPageBaseSetting.ImageOptions.Image = (Image)resources.GetObject("ribbonPageBaseSetting.ImageOptions.Image"); this.ribbonPageBaseSetting.Name = "ribbonPageBaseSetting"; this.ribbonPageBaseSetting.Text = "基础信息"; this.ribbonPageGroup2.ItemLinks.Add(this.BasicInfoNav); this.ribbonPageGroup2.Name = "ribbonPageGroup2"; this.ribbonPageUserMgr.Groups.AddRange(new RibbonPageGroup[] { this.ribbonPageGroup3 }); this.ribbonPageUserMgr.ImageOptions.Image = (Image)resources.GetObject("ribbonPageUserMgr.ImageOptions.Image"); this.ribbonPageUserMgr.Name = "ribbonPageUserMgr"; this.ribbonPageUserMgr.Text = "用户管理"; this.ribbonPageGroup3.ItemLinks.Add(this.UserMgrNav); this.ribbonPageGroup3.Name = "ribbonPageGroup3"; this.ribbonStatusBar.ItemLinks.Add(this.barHeaderItem1); this.ribbonStatusBar.ItemLinks.Add(this.barHeaderItem2); this.ribbonStatusBar.Location = new Point(0, 987); this.ribbonStatusBar.Margin = new Padding(5, 4, 5, 4); this.ribbonStatusBar.Name = "ribbonStatusBar"; this.ribbonStatusBar.Ribbon = this.ribbonControl; this.ribbonStatusBar.Size = new Size(1406, 40); this.dockManager1.Form = this; this.dockManager1.RootPanels.AddRange(new DockPanel[] { this.monitorDP }); this.dockManager1.TopZIndexControls.AddRange(new string[] { "DevExpress.XtraBars.BarDockControl", "DevExpress.XtraBars.StandaloneBarDockControl", "System.Windows.Forms.StatusBar", "System.Windows.Forms.MenuStrip", "System.Windows.Forms.StatusStrip", "DevExpress.XtraBars.Ribbon.RibbonStatusBar", "DevExpress.XtraBars.Ribbon.RibbonControl", "DevExpress.XtraBars.Navigation.OfficeNavigationBar", "DevExpress.XtraBars.Navigation.TileNavPane", "DevExpress.XtraBars.TabFormControl" }); this.monitorDP.Controls.Add(this.dockPanel1_Container); this.monitorDP.DockedAsTabbedDocument = true; this.monitorDP.FloatLocation = new Point(730, 590); this.monitorDP.FloatSize = new Size(200, 30); this.monitorDP.ID = new Guid("0f433059-bf40-435d-bd4c-0096ad54e022"); this.monitorDP.Name = "monitorDP"; this.monitorDP.Options.ShowCloseButton = false; this.monitorDP.OriginalSize = new Size(200, 200); this.monitorDP.SavedIndex = 0; this.monitorDP.SavedMdiDocument = true; this.monitorDP.Text = "生产监控"; this.monitorDP.Click += this.monitorDP_Click; this.dockPanel1_Container.Location = new Point(0, 0); this.dockPanel1_Container.Name = "dockPanel1_Container"; this.dockPanel1_Container.Size = new Size(1400, 754); this.dockPanel1_Container.TabIndex = 0; this.documentManager1.ContainerControl = this; this.documentManager1.View = this.tabbedView; this.documentManager1.ViewCollection.AddRange(new BaseView[] { this.tabbedView }); base.AutoScaleDimensions = new SizeF(8f, 18f); base.AutoScaleMode = AutoScaleMode.Font; base.ClientSize = new Size(1406, 1027); base.Controls.Add(this.ribbonStatusBar); base.Controls.Add(this.ribbonControl); base.Icon = (Icon)resources.GetObject("$this.Icon"); base.Margin = new Padding(5, 4, 5, 4); base.Name = "MainForm"; this.Ribbon = this.ribbonControl; this.StatusBar = this.ribbonStatusBar; base.WindowState = FormWindowState.Maximized; base.FormClosing += this.MainForm_FormClosing; base.FormClosed += this.MainForm_FormClosed; base.Load += this.MainForm_Load; ((ISupportInitialize)this.documentGroup1).EndInit(); ((ISupportInitialize)this.document1).EndInit(); ((ISupportInitialize)this.tabbedView).EndInit(); ((ISupportInitialize)this.ribbonControl).EndInit(); ((ISupportInitialize)this.dockManager1).EndInit(); this.monitorDP.ResumeLayout(false); ((ISupportInitialize)this.documentManager1).EndInit(); base.ResumeLayout(false); base.PerformLayout(); } // Token: 0x0400072E RID: 1838 private UserMenuDAL userMenuDal = new UserMenuDAL(DBType.MySql); // Token: 0x0400072F RID: 1839 private MachineInfoDAL machineDAL = new MachineInfoDAL(DBType.MySql); // Token: 0x04000730 RID: 1840 private BaseBLL baseBLL = new BaseBLL(); // Token: 0x04000731 RID: 1841 private IContainer components = null; // Token: 0x04000732 RID: 1842 private TabbedView tabbedView; // Token: 0x04000733 RID: 1843 private RibbonControl ribbonControl; // Token: 0x04000734 RID: 1844 private RibbonPage ribbonPageHome; // Token: 0x04000735 RID: 1845 private RibbonPageGroup ribbonPageGroup; // Token: 0x04000736 RID: 1846 private RibbonStatusBar ribbonStatusBar; // Token: 0x04000737 RID: 1847 private RibbonPageGroup ribbonPageGroupNavigation; // Token: 0x04000738 RID: 1848 private BarSubItem HomeNav; // Token: 0x04000739 RID: 1849 private SkinRibbonGalleryBarItem skinRibbonGalleryBarItem; // Token: 0x0400073A RID: 1850 private BarButtonItem employeesBarButtonItem; // Token: 0x0400073B RID: 1851 private BarButtonItem customersBarButtonItem; // Token: 0x0400073C RID: 1852 private DocumentGroup documentGroup1; // Token: 0x0400073D RID: 1853 private Document document1; // Token: 0x0400073E RID: 1854 private DockManager dockManager1; // Token: 0x0400073F RID: 1855 private DockPanel monitorDP; // Token: 0x04000740 RID: 1856 private ControlContainer dockPanel1_Container; // Token: 0x04000741 RID: 1857 private DocumentManager documentManager1; // Token: 0x04000742 RID: 1858 private BarHeaderItem barHeaderItem1; // Token: 0x04000743 RID: 1859 private BarHeaderItem barHeaderItem2; // Token: 0x04000744 RID: 1860 private BarStaticItem acount_ID; // Token: 0x04000745 RID: 1861 private BarSubItem SysSettingNav; // Token: 0x04000746 RID: 1862 private RibbonPage ribbonPageSysSetting; // Token: 0x04000747 RID: 1863 private RibbonPageGroup ribbonPageGroup1; // Token: 0x04000748 RID: 1864 private BarSubItem BasicInfoNav; // Token: 0x04000749 RID: 1865 private RibbonPage ribbonPageBaseSetting; // Token: 0x0400074A RID: 1866 private RibbonPageGroup ribbonPageGroup2; // Token: 0x0400074B RID: 1867 private BarSubItem UserMgrNav; // Token: 0x0400074C RID: 1868 private RibbonPage ribbonPageUserMgr; // Token: 0x0400074D RID: 1869 private RibbonPageGroup ribbonPageGroup3; } }
最新发布
08-15
<think>我们分析的是Windows Forms应用程序的主入口点(Main方法)和主窗体(FrmMain)的初始化过程。但是,用户现在要求分析主窗体FrmMain的代码结构,包括DevExpress组件初始化、ribbon界面、dock面板、用户权限菜单加载、配置设置初始化及多线程任务处理。 由于用户没有提供FrmMain的代码,我将根据常见的DevExpress Windows Forms应用程序结构,对主窗体的典型实现进行分析。我们将按照以下方面进行: 1. **主窗体初始化**:构造函数和加载事件处理。 2. **DevExpress组件初始化**:包括皮肤、主题、工具栏和菜单的初始化。 3. **Ribbon界面**:如何创建和配置RibbonControl和RibbonPage。 4. **Dock面板**:使用DockManager创建可停靠的面板。 5. **用户权限菜单加载**:根据用户权限动态加载菜单项。 6. **配置设置初始化**:加载应用程序的配置(如用户设置、连接字符串等)。 7. **多线程任务处理**:在WinForms中如何使用多线程(如BackgroundWorker或Task)来执行耗时操作,避免界面冻结。 由于没有具体代码,我将描述一个典型的实现模式,并给出示例代码片段。 ### 1. 主窗体初始化 在FrmMain的构造函数中,通常会进行一些初始化工作,例如初始化组件、设置窗体属性、初始化数据等。 ```csharp public FrmMain() { InitializeComponent(); // 由设计器生成,初始化窗体上的控件 // 其他初始化 this.Load += FrmMain_Load; // 注册加载事件 } ``` 在加载事件处理程序中,进行进一步的初始化,如加载配置、设置皮肤、加载用户菜单等。 ```csharp private void FrmMain_Load(object sender, EventArgs e) { InitializeDevExpressComponents(); LoadUserMenuBasedOnPermissions(); InitializeConfigurationSettings(); SetupDockPanels(); } ``` ### 2. DevExpress组件初始化 在`InitializeDevExpressComponents`方法中,设置DevExpress的皮肤和主题。 ```csharp private void InitializeDevExpressComponents() { // 设置皮肤 DevExpress.Skins.SkinManager.EnableFormSkins(); DevExpress.LookAndFeel.UserLookAndFeel.Default.SetSkinStyle("Office 2016 Colorful"); // 其他初始化,如工具栏、菜单等 } ``` ### 3. Ribbon界面 使用DevExpress的RibbonControl创建类似Office的界面。通常,我们在设计时通过拖拽控件来创建,但也可以在代码中创建。 ```csharp private void InitializeRibbon() { // 创建RibbonControl RibbonControl ribbon = new RibbonControl(); this.Controls.Add(ribbon); ribbon.Dock = DockStyle.Top; // 创建RibbonPage RibbonPage page = new RibbonPage("首页"); ribbon.Pages.Add(page); // 创建RibbonPageGroup RibbonPageGroup group = new RibbonPageGroup("操作"); page.Groups.Add(group); // 创建按钮并添加到组 BarButtonItem buttonItem = new BarButtonItem(); buttonItem.Caption = "保存"; buttonItem.ImageOptions.Image = Image.FromFile("save.png"); buttonItem.ItemClick += SaveButton_ItemClick; group.ItemLinks.Add(buttonItem); } ``` ### 4. Dock面板 使用DockManager创建可停靠的面板,例如导航面板、属性面板等。 ```csharp private DockManager dockManager; private void SetupDockPanels() { dockManager = new DockManager(this); // 创建面板 DockPanel leftPanel = dockManager.AddPanel(DockingStyle.Left); leftPanel.Text = "导航面板"; leftPanel.Width = 200; // 在面板中添加控件 TreeList treeList = new TreeList(); leftPanel.Controls.Add(treeList); treeList.Dock = DockStyle.Fill; } ``` ### 5. 用户权限菜单加载 根据当前用户的权限,动态加载菜单项。通常,我们会从数据库或配置文件中获取权限信息,然后创建对应的菜单项。 ```csharp private void LoadUserMenuBasedOnPermissions() { // 获取当前用户权限(例如,从全局变量或服务中获取) var permissions = UserService.GetCurrentUserPermissions(); // 清空现有菜单项(如果需要) ribbonPageGroup.Items.Clear(); // 根据权限动态添加 if (permissions.CanSave) { BarButtonItem saveButton = new BarButtonItem(); saveButton.Caption = "保存"; saveButton.ItemClick += SaveButton_ItemClick; ribbonPageGroup.ItemLinks.Add(saveButton); } // 同理添加其他菜单项 } ``` ### 6. 配置设置初始化 在应用程序启动时,加载配置文件中的设置,例如数据库连接字符串、用户偏好设置等。 ```csharp private void InitializeConfigurationSettings() { // 从配置文件读取设置 string connectionString = ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString; GlobalSettings.ConnectionString = connectionString; // 加载用户设置(如上次登录保存的窗口位置、皮肤设置等) if (Properties.Settings.Default.SkinName != string.Empty) { UserLookAndFeel.Default.SetSkinStyle(Properties.Settings.Default.SkinName); } } ``` ### 7. 多线程任务处理 在WinForms中,为了避免界面冻结,耗时操作应该在后台线程中执行。可以使用BackgroundWorker或Task。 ```csharp private void StartLongRunningTask() { // 使用BackgroundWorker BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (s, e) => { // 在后台线程中执行耗时操作 e.Result = LongRunningMethod(); }; worker.RunWorkerCompleted += (s, e) => { // 操作完成,更新UI if (e.Error != null) { MessageBox.Show("操作失败: " + e.Error.Message); } else { // 使用e.Result更新UI } }; worker.RunWorkerAsync(); } // 或者使用Task private async void StartLongRunningTaskAsync() { try { // 在后台线程执行,不阻塞UI var result = await Task.Run(() => LongRunningMethod()); // 回到UI线程更新界面 UpdateUI(result); } catch (Exception ex) { MessageBox.Show("操作失败: " + ex.Message); } } ``` ### 注意事项 - 在更新UI控件时,必须确保在UI线程上进行。可以使用`Control.Invoke`或`Control.BeginInvoke`方法,或者使用`async/await`模式。 - 使用DevExpress组件时,注意线程安全,DevExpress的控件通常不是线程安全的,因此必须从UI线程访问。 ### 相关问题 1. **如何实现DevExpress皮肤的动态切换?** 2. **在WinForms中,如何安全地从后台线程更新UI控件?** 3. **如何保存和恢复DockPanel的布局?** 4. **如何根据用户权限禁用某些菜单项而不是隐藏?** 5. **在应用程序退出时如何保存当前的配置设置?** 以上分析基于典型的DevExpress Windows Forms应用程序结构。具体实现可能因项目需求而异。</think>### C# Windows Forms MainForm 代码分析 以下是针对 Windows Forms 主窗体(FrmMain)的详细分析,包含 DevExpress 组件初始化、界面结构、权限管理和多线程处理等核心功能: #### 1. **主窗体初始化与组件管理** ```csharp public partial class FrmMain : DevExpress.XtraBars.Ribbon.RibbonForm { private readonly IDockManagerService _dockManagerService; private readonly IMenuLoader _menuLoader; public FrmMain(IMenuLoader menuLoader, IDockManagerService dockManagerService) { InitializeComponent(); // 窗体组件初始化 _menuLoader = menuLoader; _dockManagerService = dockManagerService; // DevExpress 皮肤初始化 DevExpress.Skins.SkinManager.EnableFormSkins(); DevExpress.LookAndFeel.UserLookAndFeel.Default.SetSkinStyle("Office 2016 Colorful"); } } ``` - **继承结构**:继承自 `RibbonForm` 提供 Office 风格界面 - **依赖注入**:通过构造函数注入菜单加载器和停靠面板服务 - **皮肤设置**:使用 DevExpress 的 Office 2016 皮肤主题 #### 2. **Ribbon 界面初始化** ```csharp private void InitializeRibbon() { // 创建 Ribbon 控件 ribbonControl = new RibbonControl(); this.Controls.Add(ribbonControl); ribbonControl.Dock = DockStyle.Top; // 添加功能区页 RibbonPage homePage = new RibbonPage("主页"); ribbonControl.Pages.Add(homePage); // 创建功能区组 RibbonPageGroup fileGroup = new RibbonPageGroup("文件"); homePage.Groups.Add(fileGroup); // 添加按钮项 BarButtonItem btnSave = new BarButtonItem(); btnSave.Caption = "保存"; btnSave.ImageOptions.SvgImage = Resources.save_icon; btnSave.ItemClick += BtnSave_Click; fileGroup.ItemLinks.Add(btnSave); } ``` - **层级结构**:RibbonPage → RibbonPageGroup → BarButtonItem - **事件绑定**:按钮点击事件 `ItemClick` 绑定业务逻辑 - **资源管理**:使用 SVG 矢量图标保证高清显示 #### 3. **Dock 面板管理系统** ```csharp private void InitializeDockPanels() { // 创建 DockManager dockManager = new DockManager(this); dockManager.Form = this; // 添加左侧导航面板 DockPanel navPanel = dockManager.AddPanel(DockingStyle.Left); navPanel.Text = "导航"; navPanel.Width = 200; // 添加树形导航控件 NavBarControl navBar = new NavBarControl(); navPanel.Controls.Add(navBar); navBar.Dock = DockStyle.Fill; // 注册面板服务 _dockManagerService.RegisterPanel("NavigationPanel", navPanel); } ``` - **面板类型**:支持 `DockingStyle.Left/Right/Top/Bottom/Fill` - **动态管理**:通过 `IDockManagerService` 实现面板的运行时控制 - **布局持久化**:支持 `SaveLayoutToXml()`/`RestoreLayoutFromXml()` 保存布局状态 #### 4. **用户权限菜单加载** ```csharp private void LoadUserMenu() { // 获取当前用户权限 var userRoles = UserSession.Current.Roles; // 动态生成菜单 var menuItems = _menuLoader.LoadMenuItems(userRoles); // 清空现有菜单 navBar.Groups.Clear(); // 添加权限过滤后的菜单项 foreach (var item in menuItems.Where(i => i.Visible)) { NavBarGroup group = new NavBarGroup(item.Text); navBar.Groups.Add(group); foreach (var child in item.Children) { NavBarItem navItem = new NavBarItem(child.Text); navItem.Tag = child.FormType; // 存储窗体类型 navItem.LinkClicked += NavItem_LinkClicked; group.ItemLinks.Add(navItem); } } } ``` - **权限过滤**:基于用户角色过滤可见菜单项 - **动态加载**:使用 `NavBarItem.Tag` 存储目标窗体类型 - **事件委托**:`LinkClicked` 事件触发窗体打开逻辑 #### 5. **配置设置初始化** ```csharp private void InitializeAppSettings() { // 加载配置文件 var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming); // 应用窗体尺寸设置 if (config.HasFile && Settings.Default.MainFormSize != Size.Empty) { this.Size = Settings.Default.MainFormSize; this.WindowState = Settings.Default.WindowState; } // 初始化数据库连接 string connString = ConfigurationManager.ConnectionStrings["MainDB"].ConnectionString; DbConnectionFactory.Initialize(connString); // 加载皮肤偏好 string skinName = Settings.Default.SkinName ?? "Office 2016 Colorful"; UserLookAndFeel.Default.SetSkinStyle(skinName); } ``` - **配置存储**:使用 `Settings.Default` 持久化用户设置 - **动态加载**:从 app.config/web.config 获取连接字符串 - **状态恢复**:自动恢复窗体大小和窗口状态 #### 6. **多线程任务处理** ```csharp private void StartBackgroundTask() { // 使用 BackgroundWorker var worker = new BackgroundWorker(); worker.DoWork += (sender, e) => { // 后台执行耗时操作 var data = DataService.FetchLargeDataset(); e.Result = data; }; worker.RunWorkerCompleted += (sender, e) => { if (e.Error != null) { splashScreenManager.Close(); MessageBox.Show($"错误: {e.Error.Message}"); } else { ProcessData(e.Result); } }; // 显示加载界面 splashScreenManager.ShowWaitForm(); worker.RunWorkerAsync(); } // 使用 async/await 模式 private async Task LoadDataAsync() { try { splashScreenManager.ShowWaitForm(); // 异步执行IO操作 var data = await Task.Run(() => DataService.FetchLargeDatasetAsync()); // 回到UI线程更新 this.BeginInvoke((Action)(() => { dataGridControl.DataSource = data; splashScreenManager.Close(); })); } catch (Exception ex) { splashScreenManager.Close(); LogHelper.Error("数据加载失败", ex); } } ``` - **线程管理**:`BackgroundWorker` 和 `Task` 两种模式 - **UI友好**:使用 `SplashScreenManager` 显示加载状态 - **线程安全**:`BeginInvoke` 确保UI更新在主线程执行 - **异常处理**:完善的错误处理和日志记录 ### 典型执行流程 1. **构造函数**:初始化基础组件和依赖服务 2. **Load 事件**:调用 `InitializeRibbon()`, `InitializeDockPanels()` 3. **Shown 事件**:执行 `LoadUserMenu()`, `InitializeAppSettings()` 4. **后台加载**:启动 `StartBackgroundTask()` 预加载数据 5. **用户交互**:通过 Ribbon 按钮和导航菜单触发业务功能 6. **关闭处理**:保存窗体状态和用户设置 ### 性能优化建议 1. **延迟加载**:对耗资源组件使用 `Lazy<T>` 初始化 2. **虚拟滚动**:大数据集使用 `GridControl.VirtualMode=true` 3. **资源释放**:实现 `IDisposable` 确保正确释放非托管资源 4. **异步初始化**:`async void FrmMain_Load()` 加速启动过程 ### 相关问题 1. **如何实现 DevExpress 皮肤的动态切换?** 通过 `UserLookAndFeel.Default.SetSkinStyle(skinName)` 和皮肤选择器控件[^1] 2. **如何保存和恢复 DockPanel 的布局状态?** 使用 `dockManager.SaveLayoutToXml()` 和 `RestoreLayoutFromXml()` 方法[^2] 3. **在 WinForms 中如何安全地进行跨线程 UI 更新?** 使用 `Control.BeginInvoke` 或 `SynchronizationContext.Post` 方法[^3] 4. **如何实现基于角色的菜单权限动态加载?** 通过权限服务过滤菜单项并绑定到导航控件[^4] 5. **如何处理主窗体关闭前的资源释放?** 在 `FormClosing` 事件中调用 `Dispose()` 并释放非托管资源[^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值