C#의 반사 메커니즘을 사용하여 DLL 클래스 라이브러리 동적 호출
19960 단어 반사 메커니즘
자, 그 전에 반사에 필요한 몇 가지 종류를 여러분께 열거해 드리겠습니다.
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);
}
}
}
됐다.이제 어떻게 호출하는지 뛰어볼 수 있고 디버깅 모드에서 코드를 읽을 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 베이스-반사 메커니즘반사 반사는 우리로 하여금 유연한 코드를 쉽게 만들 수 있게 한다. 이 코드들은 실행할 때 조립할 수 있으며, 구성 요소 간에 원본 코드 링크를 할 필요가 없다.반사는 우리가 작성하고 실행할 때 원본 코드에서 선택한...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.