c# 동적으로 dll을 불러오고 dll의 클래스를 호출하는 방법
3163 단어 dll
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를 변환하여 계승된 인터페이스로 변환합니다. 지금부터 강력한 유형의 조작이 시작됩니다.내가 여기에서 한 동작은 링크랩을 만들고 이름을 설정하고 실행하는 방법을 누르는 것이다.대충 그렇습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LoadLibrary에서 126 오류가 발생하면 원인이되는 파일 이름을 찾는 방법Loadlibrary에서 DLL을 동적으로 로드할 때 로드 실패입니다. 실패한 파일 이름은 알려주지 않습니다. 로드하고자 하는 DLL 자체를 로드할 수 없다면 이야기는 간단하지만, 대상 DLL이 다른 DLL을 로드하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.