一、DLL源文件
User:
public class User
{
public string UserName { get; set; }
private string Password { get; set; }
}
Student:
public class Student
{
public Student(string name)
{
Name = name;
}
public string TestFiled;
public string Name { get; set; }
public int Age { get; set; }
public char Gender { get; set; }
public string IdCard { get; set; }
public string Address { get; set; }
private string Mobile { get; set; }
public void Introduce()
{
Console.WriteLine($"我的名字是{Name}!");
}
public string ChangeName(string newName)
{
Name = newName;
return Name;
}
public void Eat()
{
Console.WriteLine("我今天吃啦好多东西");
}
public void Sing()
{
Console.WriteLine("耶耶耶耶耶");
}
public int Calculate(int a, int b)
{
return a + b;
}
private string PrivateMethod()
{
return "我是一个私有方法";
}
}
二、代码测试类
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.LoadFile(@"DLL绝对路径");
WriteInfoForDll(assembly);
PropertyAndMethodTest(assembly);
}
/// <summary>
/// 属性与方法测试
/// </summary>
/// <param name="assembly"></param>
private static void PropertyAndMethodTest(Assembly assembly)
{
//获取类定义
Type studentType = assembly.GetType("StudentClass.Student");
//根据类定义获取实例
object student = Activator.CreateInstance(studentType, new object[] { "Bob" });
//获取属性
string propertyValue = studentType.InvokeMember("Name", BindingFlags.GetProperty, null, student, null).ToString();
Console.WriteLine("改名前属性:" + propertyValue);
//调用无参数函数
studentType.InvokeMember("Introduce", BindingFlags.InvokeMethod, null, student, null);
//调用有参数函数
string newName = studentType.InvokeMember("ChangeName", BindingFlags.InvokeMethod, null, student, new object[] { "Alice" }).ToString();
Console.WriteLine($"新名字{newName}!");
//重新调用属性
propertyValue = studentType.InvokeMember("Name", BindingFlags.GetProperty, null, student, null).ToString();
Console.WriteLine("改名后属性:" + propertyValue);
}
/// <summary>
/// DLL属性获取
/// </summary>
/// <param name="assembly"></param>
private static void WriteInfoForDll(Assembly assembly)
{
Console.WriteLine("程序集名字:" + assembly.FullName);
Console.WriteLine("程序集位置:" + assembly.Location);
Console.WriteLine("运行程序集需要的额CLR版本:" + assembly.ImageRuntimeVersion);
Console.WriteLine("====================================================");
//获取模块信息
Module[] modules = assembly.GetModules();
foreach (Module item in modules)
{
Console.WriteLine("模块名称:" + item.Name);
Console.WriteLine("模块版本ID" + item.ModuleVersionId);
}
Console.WriteLine("======================================================");
//获取类,通过模块和程序集都可以
Type[] types = assembly.GetTypes();
foreach (Type item in types)
{
Console.WriteLine("类型的名称:" + item.Name);
Console.WriteLine("类型的完全命名:" + item.FullName);
Console.WriteLine("类型的类别:" + item.Attributes);
Console.WriteLine("类型的GUID:" + item.GUID);
Console.WriteLine("=====================================================");
SeeClass(assembly, item.FullName);
}
}
/// <summary>
/// 查看成员信息
/// </summary>
/// <param name="assembly"></param>
/// <param name="name"></param>
public static void SeeClass(Assembly assembly, string name)
{
//获取主要类Student的成员信息等
Type studentType = assembly.GetType(name);//完全命名
MemberInfo[] mi = studentType.GetMembers();
foreach (MemberInfo item in mi)
{
Console.WriteLine("成员的名称:" + item.Name);
Console.WriteLine("成员类别:" + item.MemberType);
}
Console.WriteLine("=====================================");
//获取方法
BindingFlags flags = BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance;
MethodInfo[] methodInfo = studentType.GetMethods(flags);
foreach (MethodInfo item in methodInfo)
{
Console.WriteLine("public类型的,不包括基类继承的实例方法:" + item.Name);
}
Console.WriteLine("========================================");
BindingFlags flag = BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic;
MethodInfo[] methods = studentType.GetMethods(flag);
foreach (MethodInfo item in methods)
{
Console.WriteLine("非public类型的,不包括基类继承的实例方法:" + item.Name);
}
Console.WriteLine("========================================");
//获取属性
BindingFlags flags2 = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.Instance;
PropertyInfo[] pi = studentType.GetProperties(flags2);
foreach (PropertyInfo item in pi)
{
Console.WriteLine("属性名称:" + item.Name);
}
Console.WriteLine("========================================");
}
}