c# 동적으로 dll을 불러오고 dll의 클래스를 호출하는 방법

3163 단어 dll
물론 이것은 위탁 관리의 dll와 위탁 관리의 방법을 가리키는데 실제로 사용하는 것은 대부분 반사(reflecting) 명명 공간에서 사용된다.용도가 광범위할지도 몰라요. 확신은 없지만 이것은 운행기에 귀속된 거예요. 그러면 컴파일러 귀속이 그렇게 경직되지는 않을 거예요. 하지만 컴파일러 귀속이 그렇게 간단하지도 않아요.플러그인 같은 거 할 수 있어요.먼저 하나의 인터페이스, 이 인터페이스를 실현한 종류는 합법적으로 여겨지고 불러올 수 있는...
namespace gp

{

    public delegate void DoWhat();

    public interface IInterface

    {

        string GetName();

        DoWhat dowhat { get; set; }

    }

}

간단한 인터페이스, 하나는 무엇을 하는지 판단하는 함수이고, 다른 하나는 방법의 의뢰, 무엇을 하는지.그 다음에 우리는 프로젝트를 새로 만들고 클래스를 만들어서 이 인터페이스를 실현한다.
 
namespace gp

{

    public delegate void DoWhat();

    public interface IInterface

    {

        string GetName();

        DoWhat dowhat { get; set; }

    }

}

구조 함수에 의뢰를 추가하면 그 의뢰를 수행할 때 이 함수를 실행합니다.지금은 중요한 부분입니다. 코드의 난이도가 크지 않습니다. 윈도우즈 응용 프로그램을 새로 만들고 창 위에 패널을 드래그합니다. 이것은 동적 불러온 후에 조작 단추를 올리기 위해서입니다.그러나 중첩될 수 있으므로 플로럴 아웃패널을 고려해 보세요. 이것은 개수를 충족시키기 위해 자동으로 리셋됩니다.anyway, 상관없습니다. 어쨌든 개념을 논술하기 위해서입니다.
        private void Form1_Load(object sender, EventArgs e)

        {

            var plugindir = System.IO.Directory.GetParent(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).CreateSubdirectory("startup");

            foreach (var filesInPlugin in plugindir.GetFiles())

            {

                if (filesInPlugin.Extension.ToLower() == ".dll")

                {

                    Assembly dllFromPlugin = Assembly.LoadFile(filesInPlugin.FullName);

                    foreach (var dllModule in dllFromPlugin.GetLoadedModules())

                    {

                        foreach (var typeDefinedInModule in dllModule.GetTypes())

                        {

                            if (typeDefinedInModule.GetInterfaces().Contains(typeof(gp.IInterface)))

                            {

                                if (typeDefinedInModule.IsClass)

                                {

                                    var itemGet = System.Activator.CreateInstance(typeDefinedInModule) as gp.IInterface;

                                    LinkLabel ll_now = new LinkLabel();

                                    ll_now.Text = itemGet.GetName();

                                    ll_now.Click += (a, b) => { if (itemGet.dowhat != null)itemGet.dowhat(); };

                                    panel1.Controls.Add(ll_now);

                                }

                            }

                        }

                    }

                }

            }

        }

이해하기 어렵지 않은 코드는 플러그인 폴더의 위치를 지정하고 없으면 만듭니다.그리고 안에 있는 dll 형식의 파일을 훑어보고 이 파일을 불러오려고 합니다. 실제 상황에서try를 넣어야 합니다.catch, 당신이 불러온 dll 파일이 합법적인 dll 파일인지 아무도 모르기 때문에 안의 모듈을 훑어보고 모듈 안의 정의된 유형인 클래스,interface, 매거 등등 여러 가지를 훑어보고 이 장난감의 통합된 인터페이스를 얻어 우리의 인터페이스를 포함하는지 판단합니다.(즉, 이interface를 포함하고 합법적인 플러그인 클래스라고 해도) 만약에 포함된다면 이것은 하나의 클래스가 아니라고 판단한다. 왜냐하면 인터페이스는 다른 것들 중에서 계승될 수 있기 때문이다. 예를 들어 다른 인터페이스 등이다. 다른 이런 상황은 우리에게 아무런 의미가 없다.그리고 우리는 동적으로 이 종류의 실례인 System을 만들었다.Activator.CreateInstance를 변환하여 계승된 인터페이스로 변환합니다. 지금부터 강력한 유형의 조작이 시작됩니다.내가 여기에서 한 동작은 링크랩을 만들고 이름을 설정하고 실행하는 방법을 누르는 것이다.대충 그렇습니다.

좋은 웹페이지 즐겨찾기