반응형

* 동적으로 DLL 로드 하여 그 안에 포함된 Form 과 클래스 함수 사용 예제...

 

시작 하기에 앞서 테스트 DLL 만들기...

 

그대로 ClassLibrary1 을 사용 하여 만들어서 DLL 안에 내용은 아래의 그림과 같이

폼 하나 클래스 하나를 만들어 보았습니다. 클래스 안에는 테스트 하는 함수 하나를 만들었습니다.

이제 테스트 DLL 도 만들었고 준비도 다 되었으니 동적으로 DLL 을 로드 하여 저 안에 있는 클래스 함수

와 폼을 사용 해 보도록 하겠습니다.

 

테스트 DLL 위치는 위와 같이 그냥 C:\\ 에 놔두었는데 위치는 사용자 맘대로 두어도 괜찮겠습니다.

나중에 소스코드에서 DLL 로드 위치를 사용자가 Dll 이 있는 위치로 지정 하면 되겠습니다.

 

메인화면...

전체 소스 코드

Form1.cs

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CSharp_동적Dll
{
    public partial class Form1 : Form
    {
        System.Reflection.Assembly ab;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            //DLL 파일만 열수 있게끔...
            ofd.Filter = "Dll File (*.dll) | *.dll";

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                //선택된 dll 파일 표시...
                label1.Text = ofd.FileName;

                //동적 dll 로드
                ab = System.Reflection.Assembly.LoadFile("C:\\ClassLibrary1.dll");
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
        	//파일이 존재 하지 않으면...
            if (!System.IO.File.Exists(label1.Text)) return;
            //form
            if (ab != null)
            {
                Type[] tp = ab.GetExportedTypes();

                if (tp.Length > 0)
                {
                    foreach (Type t in tp)
                    {
                        //Form 이름 Form1
                        if (t.Name == "Form1")
                        {
                            //객체화 
                            object ob = Activator.CreateInstance(t);
                            //폼 객체로 변환
                            Form f = ob as Form;
                            f.Show();
                        }
                    }
                }

            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //파일이 존재 하지 않으면...
            if (!System.IO.File.Exists(label1.Text)) return;
            //class
            if (ab != null)
            {
                Type[] tp = ab.GetExportedTypes();

                if (tp.Length > 0)
                {
                    foreach (Type t in tp)
                    {
                        //class 이름
                        if (t.Name == "Class1")
                        {
                            //클래스 함수 얻어 오기...
                            System.Reflection.MethodInfo mt = t.GetMethod("Test");
                            //객체화 
                            object ob = Activator.CreateInstance(t);

                            //MethodInfo 인보크 (객체화 한 클래스, 함수 전달 인자)
                            //vReturn : 함수 결과값 리턴값...
                            var vReturn = mt.Invoke(ob, new object[] { 299, 300 });
                            
                            //함수 결과값...
                            MessageBox.Show(vReturn.ToString());

                        }
                    }
                }
            }
        }
    }
}

 

* 폼 불러오기

* 클래스 함수 불러오기

 

* 예제 결과 화면

 

폼 불러오기 결과 화면

 

클래스 함수 불러오기 결과 화면

 

반응형

+ Recent posts