在C中,通过反射获取程序集通常涉及以下几种方法:
使用`Assembly.Load()`、`Assembly.LoadFile()`或`Assembly.LoadFrom()`方法
`Assembly.Load()`:需要提供程序集的名称。
`Assembly.LoadFile()`:需要提供程序集完整的路径。
`Assembly.LoadFrom()`:需要提供程序集名称及其后缀名。
使用`AppDomain.CurrentDomain.GetAssemblies()`方法
该方法可以获取当前应用程序域中所有已加载的程序集,但不会获取引用的未加载的程序集。
使用`Assembly.GetEntryAssembly().GetReferencedAssemblies()`方法
该方法可以获取当前程序集引用的所有程序集,包括已加载和未加载的,但返回的是`AssemblyName`对象集,而不是`Assembly`对象集。
使用`Assembly.LoadFrom(string path)`方法
该方法用于加载指定路径的程序集,适用于加载不同标识的程序集,但不能用于加载标识相同但路径不同的程序集。
示例代码
```csharp
using System;
using System.Collections.Generic;
using System.Reflection;
class Program
{
static void Main()
{
// 加载程序集
Assembly assembly = Assembly.Load("Lys");
// 获取程序集中的所有类型
Type[] types = assembly.GetTypes();
foreach (Type type in types)
{
Console.WriteLine(type.FullName);
}
// 获取指定类型的实例
Type targetType = assembly.GetType("Lys.UIteamanLys");
object instance = Activator.CreateInstance(targetType);
// 获取类型的方法
MethodInfo[] methods = targetType.GetMethods();
foreach (MethodInfo method in methods)
{
Console.WriteLine(method.Name);
}
// 获取类型的属性
PropertyInfo[] properties = targetType.GetProperties();
foreach (PropertyInfo property in properties)
{
Console.WriteLine(property.Name);
}
// 获取类型的字段
FieldInfo[] fields = targetType.GetFields();
foreach (FieldInfo field in fields)
{
Console.WriteLine(field.Name);
}
}
}
```
建议
性能考虑:反射操作通常比直接调用方法或访问属性慢,因此在性能敏感的代码中应谨慎使用。
错误处理:在使用反射时,应确保处理可能出现的异常,例如程序集加载失败或类型查找失败。
类型安全:反射代码可能失去编译时类型检查,因此在使用反射时应注意类型安全。
通过上述方法,你可以有效地使用C反射来获取程序集中的信息和创建对象实例。