C#의 반사 메커니즘을 사용하여 DLL 클래스 라이브러리 동적 호출

19960 단어 반사 메커니즘
최근에 업무 요구로 인해 DLL 라이브러리를 동적 호출해야 하기 때문에 연구를 해 봤는데 그래도 어렵지 않다고 느꼈습니다. 오늘은 자신이 이해한 것을 작은 예(VS2005를 통해 통해)로 써서 여러분과 함께 연구하고 토론할 수 있도록 했습니다. 이해가 부적절한 부분이 있으면 많은 분들께서 지적해 주셔서 감사합니다.
 
자, 그 전에 반사에 필요한 몇 가지 종류를 여러분께 열거해 드리겠습니다.
1. Assembly 클래스를 사용하여 프로그램 집합을 정의하고 불러옵니다. 프로그램 집합 목록에 모듈을 불러오고, 이 프로그램에서 유형을 집중적으로 찾아서 이 유형의 실례를 만듭니다.
2. MethodInfo를 사용하여 방법의 명칭, 되돌아오는 유형, 파라미터, 접근 수식자(예를 들어pulic나private)와 상세한 정보(예를 들어 abstract나virtual)를 실현한다.특정 메서드를 호출하려면 Type의 GetMethods 또는 GetMethod 메서드를 사용합니다.
1. 반사 호출을 위한 DLL 만들기
 
using System;

using System.Collections.Generic;

using System.Text;

namespace RefDll

{

    /// <summary>

    ///         DLL  

    /// </summary>

    public class RefTest

    {

        /// <summary>

        ///     

        /// </summary>

        /// <param name="x">    </param>

        /// <param name="y">    </param>

        /// <param name="sum">  ( )</param>

        public void TestSum(int x,int y,out int sum)

        {

            sum = 0;

            sum = x + y;

        }

        /// <summary>

        ///     

        ///      

        /// </summary>

        /// <param name="x">    </param>

        /// <param name="y">    </param>

        /// <returns>  ( )</returns>

        public int TestSumTwo(int x, int y)

        {

            return x + y;

        }

        /// <summary>

        ///     

        ///      

        /// </summary>

        /// <param name="x">    </param>

        /// <param name="y">    </param>

        /// <param name="sum">  ( )</param>

        public static void TestSumThree(int x, int y, out int sum)

        {

            sum = 0;

            sum = x + y;

        }

    }

}

 
2. 반사에 응용된 예
주: 컨트롤러를 만들 수 있는 프로젝트입니다.
 
using System;

using System.Collections.Generic;

using System.Text;

using System.Reflection;

using System.Windows.Forms;

using System.IO;

namespace ReflectionLesson

{

    /// <summary>

    ///    

    ///         DLL  。

    /// </summary>

    public class ReflectionLesson

    {

        private string strDllName = "";

        private string strClaName = "";

        private string[] strMetName = null;

        /// <summary>

        ///     

        /// </summary>

        /// <param name="DllName">   DLL   </param>

        /// <param name="ClaName">     </param>

        /// <param name="MetName">      (  )</param>

        public ReflectionLesson(string DllName, string ClaName, string[] MetName)

        {

            //     DLL  

            this.strClaName = ClaName;

            this.strDllName = DllName;

            this.strMetName = MetName;

        }

        /// <summary>

        ///         DLL  

        /// </summary>

        public void ReflectionTest(int x,int y)

        {

            Assembly ass;

            Type type;

            object obj;

            if (File.Exists(Application.StartupPath + "\\" + this.strDllName + ".dll"))

            {

                //     DLL       

                ass = Assembly.LoadFile(Application.StartupPath + "\\" + this.strDllName + ".dll");

                //      :        +   

                type = ass.GetType(this.strDllName + "." + this.strClaName);

                //

                MethodInfo method1 = type.GetMethod(this.strMetName[0]);

                MethodInfo method2 = type.GetMethod(this.strMetName[1]);

                MethodInfo method3 = type.GetMethod(this.strMetName[2]);

                ////        +   

                obj = ass.CreateInstance(this.strDllName + "." + this.strClaName);

                //      

                method1 = type.GetMethod(this.strMetName[0]);//     1

                method2 = type.GetMethod(this.strMetName[1]);//     2

                method3 = type.GetMethod(this.strMetName[2]);//     3

                object[] parts = new object[3];

                parts[0] = x;

                parts[1] = y;

                //     

                // :     DLL         ,  Invoke           NULL。

                //             ,  Invoke            obj(          )

        method1.Invoke(obj, parts);

        Console.WriteLine("      " + this.strMetName[0] + ": " + x + " + " + y + " = " + parts[2]);

           int sum1 = (int)method2.Invoke(obj, new object[] { x + 10, y + 10 });

           Console.WriteLine("      " + this.strMetName[1] + ": " + (x + 10) + " + " + (y + 10) + " = " + sum1);



                object[] temParts = new object[3];

                temParts[0] = x + 20;

                temParts[1] = y + 20;

                method3.Invoke(null, temParts);

                Console.WriteLine("      " + this.strMetName[2] + ": " + temParts[0] + " + " + temParts[1] + " = " + temParts[2]);

            }

        }

    }

}

 
Main 함수에 다음 코드를 입력할 수 있습니다.
using System;

using System.Collections.Generic;

using System.Text;

using System.Windows.Forms;

namespace ReflectionLesson

{

    class Program

    {

        static void Main(string[] args)

        {

            string dllname = "RefDll";

            string claname ="RefTest";

            string[] metname = new string[]{"TestSum","TestSumTwo","TestSumThree"};

            ReflectionLesson refl = new ReflectionLesson(dllname, claname, metname);

            refl.ReflectionTest(100,200);

        }

    }

}

됐다.이제 어떻게 호출하는지 뛰어볼 수 있고 디버깅 모드에서 코드를 읽을 수 있습니다.
 

좋은 웹페이지 즐겨찾기