Explicación detallada de C#: dominio del programa, ensamblado, módulo, tipo, reflejo

Resumir:

">>>": Representa
el proceso que contiene >>> dominio de aplicación AppDomain >>> ensamblado Ensamblado >>> módulo Módulo >>> tipo Tipo >>> miembros (métodos, atributos, etc.)

1. Montaje Montaje

Como se muestra en la figura, suponga que hay varios proyectos creados en una solución:
(1) SuperControl: *proyecto principal que se iniciará*
(2) ClassLibrary1: una biblioteca de clases personalizada a la que el proyecto principal debe hacer referencia
(3) WindowsFormsApplication1: no tiene nada que ver con el proyecto principal, no existe una relación de referencia
(4) Otros ensamblajes DLL del sistema al que se hace referencia en el proyecto principal: por ejemplo,
después de que el programa System.Windows.Forms comience a ejecutarse, se creará un dominio de aplicación, que contiene múltiples ensamblajes, hay (1) 2) (4).
Cada montaje puede entenderse como un proyecto independiente.

Use Assembly.GetExecutingAssembly() para obtener el ensamblado del código que se está ejecutando actualmente, lo que puede entenderse como obtener el SuperControl del proyecto principal actual. Use AppDomain.CurrentDomain.GetAssemblies() para obtener todos los ensamblados que se usan en el dominio de la aplicación actual. Como se muestra abajo.

Complemento:
si se hace referencia a la biblioteca de clases ClassLibrary1 en el proyecto en ejecución SuperControl, también se hace referencia al espacio de nombres que usa ClassLibrary1. Pero el código real no usa nada en el proyecto ClassLibrary1.Usar AppDomain.CurrentDomain.GetAssemblies() no obtendrá el ensamblado llamado ClassLibrary1

2. Módulo Módulo

Tome el ensamblado SuperControl como ejemplo, que contiene solo un programa ejecutable SuperControl.exe.

3. Tipo Tipo

1. Es la clase clase, la estructura struct, la enumeración enumeración, etc., todas pertenecen al tipo Tipo.
2. Si usa la reflexión, debe obtener el tipo específico Tipo. Tener el tipo Type significa tener toda la información dentro de la clase y, en el futuro, se puede generar dinámicamente una nueva instancia de manera arbitraria, o se pueden cambiar dinámicamente los datos de la instancia original.
3. Si desea obtener las clases definidas en un determinado proyecto (es decir, ensamblaje de ensamblaje), puede usar ensamblaje de ensamblaje o módulo para obtenerlo, porque son casi una sola cosa, y lo principal en un solo ensamblaje de ensamblaje es es decir módulos .exe o .dll. Montaje Montaje >>> Módulo Módulo.
ejemplo:

 Assembly assembly = Assembly.GetExecutingAssembly();//获取当前项目程序集
            Type[] types = assembly.GetTypes();

 Assembly assembly = Assembly.GetExecutingAssembly();//获取当前项目程序集
       Module module = assembly.GetModule("SuperControl.exe");//获取里面的模块
            types = module.GetTypes();//获取里面所有的类型

4. Reflexión: generar dinámicamente una instancia del nombre de clase SubForm en el proyecto SuperControl

//Assembly assembly = //Assembly.LoadFrom(@"C:\Users\Administrator\Desktop\TEST\ControlMoveTEST\SuperControl\
//SuperControl\bin\Debug\SuperControl");

  Assembly asy = Assembly.GetExecutingAssembly();
  object obj = asy.CreateInstance("SuperControl.SubForm");//填类型全名,包括命名空间
//如果要操作其他的项目程序集里的内容,就获取别的项目的Assembly。

//(1)显示窗体方式1
	((SubForm)obj).Show();//显示窗体
//(2)显示窗体方式2
   Type typeInfo = asy.GetType("SuperControl.SubForm");//填类型全名,包括命名空间
   MethodInfo minfo = typeInfo.GetMethod("Show",new Type[]{});//显示窗体1
   minfo.Invoke(obj, null);//显示窗体2
//(3) 设置窗体的启动位置
   typeInfo.GetProperty("StartPosition").SetValue(obj, FormStartPosition.CenterScreen);

5. Caso de reflexión

El programa utiliza el método CreateControl() para generar dinámicamente los controles requeridos según la elección del usuario: FlowLayoutPanel, Button, Label

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;

namespace SuperControl
{
    public partial class SubForm : DockContent
    {
        public SubForm()
        {
            InitializeComponent();

            this.ContextMenuStrip = contextMenuStrip1;
        }




        private void layoutPanelToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CreateControl(typeof(FlowLayoutPanel), "fpanel");
        }

        private void buttonToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CreateControl(typeof(Button), "btn");
        }

        private void labelToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CreateControl(typeof(Label), "text");
        }

        public void obj_MouseDown(object sender, MouseEventArgs e)
        {
            MoveControl(sender as Control, e);
        }

        public void CreateControl(Type tp, string text)
        {
            // object obj = Assembly.GetExecutingAssembly().CreateInstance(tp.FullName); //不能用这个,因为该类型不是在当前程序集里                
             
            //方法一、
            object obj = Activator.CreateInstance(tp); //这个可以,应该是自动获取了必要的信息

            //方法二、
       //object obj =                 
      //AppDomain.CurrentDomain.CreateInstanceAndUnwrap("System.Windows.Forms,             
     //Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", tp.FullName);


            tp.GetProperty("Text").SetValue(obj, text); //设置Text
            tp.GetEvent("MouseDown").AddEventHandler(obj, new MouseEventHandler(obj_MouseDown)); //注册事件
            Point p = PointToClient(new Point(Control.MousePosition.X - 20, Control.MousePosition.Y - 10));
            tp.GetProperty("Location").SetValue(obj, p); //设置显示位置
            if (tp == typeof(FlowLayoutPanel))
            {
                tp.GetProperty("BorderStyle").SetValue(obj, BorderStyle.FixedSingle); //设置控件边框

            }
            this.Controls.Add(obj as Control); //将生成的控件添加到界面
        }






        #region 控件移动API


        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern bool ReleaseCapture();

        private void MoveControl(Control sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && e.Clicks == 1)
            {
                ReleaseCapture();
                SendMessage(sender.Handle, 161, 2, 0);
                SendMessage(sender.Handle, 0x0202, 0, 0);
            }
            else
            {
                //添加双击或右击代码……
            }
        }


        #endregion


    }
}

Supongo que te gusta

Origin blog.csdn.net/stephon_100/article/details/128152503
Recomendado
Clasificación