using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Linq;
namespace ConsoleApp1
{
class TestClass
{
public string TestFunc(string z, string b, string c)
{
return $"z is {z};b is {b};c is {c};";
}
}
class Program
{
static void Main(string[] args)
{
var assembly = typeof(test111).Assembly;
var instance = assembly.CreateInstance("ConsoleApp1.TestClass");
var mod = instance.GetType().GetMethod("TestFunc");
List<string> names = mod.GetParameters().Select(f => f.Name).ToList();
List<object> parameters = new List<object>();
foreach (var item in names)
{
parameters.Add(item);
}
Console.WriteLine($"{mod.Invoke(instance, parameters.ToArray())}");
Console.ReadKey();
return;
}
}
}
/// <summary>
/// 得到插件中实现接口的实例<T>是某接口
/// </summary>
/// <param name="pDllpath">实现了接口的dll完整路径和文件名</param>
/// <returns></returns>
public static T GetAssemblyLkf<T>(string pDllpath)
{
T MyInstance = default(T);
Assembly asm = null;
try
{
asm = Assembly.LoadFile(pDllpath);
}
catch (BadImageFormatException ex)
{
return MyInstance;
}
Type[] types = asm.GetExportedTypes();
foreach (Type type in types)
{
Type typeInstance = typeof(T);
//判断遍历的类型是否实现了T接口,以前用as 转换为接口,判断是否为空
if (typeInstance.IsAssignableFrom(type) && !type.IsAbstract)
{
MyInstance = (T)Activator.CreateInstance(type);
}
}
return MyInstance;
}
/// <summary>
/// 全局通用反射示例
/// </summary>
/// <param name="assemblyName">项目名称</param>
/// <param name="className">类名称</param>
/// <param name="methodName">函数名称</param>
/// <param name="parms">参数</param>
/// <returns></returns>
public static Object GetClassMethodReturnResult(string assemblyName, string className, string methodName, Object[] parms)
{
Assembly ass = Assembly.Load(assemblyName);
Type[] types = ass.GetTypes();
object result = null;
foreach (Type item in types)
{
if (item.Name.Equals(className))
{
try
{
if (parms != null && parms.Length > 0)
{
object obj = Activator.CreateInstance(item);
Type[] types1=new Type[parms.Length];
for (int i = 0; i < parms.Length; i++)
{
types1[i] = parms[i].GetType();
}
MethodInfo[] methods = item.GetMethods();
foreach (var mm in methods)
{
if (mm.Name == methodName)
{
if(mm.GetParameters().Length==parms.Length)
result = mm.Invoke(obj, parms);
}
}
}
else
{
object obj = Activator.CreateInstance(item);
MethodInfo m = item.GetMethod(methodName,new Type[]{});
result = m.Invoke(obj, parms);
}
}
catch (Exception e)
{
throw e;
}
}
}
return result;
}
调用示例
object[] o = new object[] {
IdenCard.Text.Trim(),table
};
bool IsExist = (bool)Reflaction.GetClassMethodReturnResult("BizProcess", "AuthorizationRecordBiz", "ExistAuthorizationByIden", o);
顺手放几个github上的库解救被动态代理和动态反射困扰的各位。CoreProxy --动态代理dynamitey --动态反射能干什么就小蜜蜂论坛发帖机看你需要干什么了。
Stream stream = new FileStream("net同版本.exe", FileMode.Open);
byte[] bt = new byte[stream.Length];
stream.Read(bt, 0, (int)stream.Length);
stream.Close();