dll调用方式(dll调用接口)

C#程序中为了热插拔或者根据条件调用插件,或者动态配置菜单,都需要用到动态调用其他dll文件的方法。总结如下

一:非泛型类方法调用

  /// <summary>
/// 非泛型类方法调用
/// </summary>
/// <param name="assemblyName">调用方法对应的dll文件名</param>
/// <param name="ClassName">调用方法对应的类名</param>
/// <param name="methodName">调用方法名称</param>
/// <param name="staticflag">是否静态方法,默认是false</param>
/// <param name="parametes">调用方法的参数列表</param>
/// <returns></returns>
public static object RunMethod(string assemblyName, string ClassName, string methodName, bool staticflag = false, params object[] parametes)
{
//加载dll文件
Assembly _Assembly = Assembly.LoadFrom(assemblyName);
Type MethodType = _Assembly.GetType(ClassName);
//获取参数列表的类型集合
List<Type> types = new List<Type>();
foreach (var p in parametes)
{
types.Add(p.GetType());
}
Type[] _TypeArrary = types.ToArray();
MethodInfo GenericMethod = _TypeArrary.Length > 0 ? MethodType.GetMethod(methodName, _TypeArrary) : MethodType.GetMethod(methodName);
//如果不是静态方法就创建
var obj = staticflag ? null : Activator.CreateInstance(MethodType);
//参数有默认值也必须填写
//bool flag = false;
if (_TypeArrary != null && _TypeArrary.Length > 0)
return GenericMethod.Invoke(obj, parametes);
else
//return GenericMethod.Invoke(obj, new object[] { flag });
return GenericMethod.Invoke(obj, null);
}

二:泛型类方法调用

  /// <summary>
/// 泛型类方法调用
/// </summary>
/// <param name="dynamicAssemblyName">动态类所在dll文件名称</param>
/// <param name="dynamicClassName">动态类名称</param>
/// <param name="assemblyName">动态类参数T所在的dll文件/param>
/// <param name="ClassName">动态类参数T类名</param>
/// <param name="methodName">调用方法名称</param>
/// <param name="staticflag">是否静态方法,默认是false</param>
/// <param name="parametes">调用方法的参数列表</param>
/// <returns></returns>
public static object RunMethod4Dynamic(string dynamicAssemblyName, string dynamicClassName, string assemblyName, string ClassName, string methodName, bool staticflag = false, params object[] parametes)
{
Assembly _Assembly = Assembly.LoadFrom(assemblyName);
Type entityType = _Assembly.GetType(ClassName);
Assembly _a = Assembly.LoadFrom(dynamicAssemblyName);
dynamicClassName = dynamicClassName + "`1[[" + entityType.FullName + "," + entityType.Assembly.ToString() + "]]";
Type MethodType = _a.GetType(dynamicClassName);
List<Type> types = new List<Type>();
foreach (var p in parametes)
{
types.Add(p.GetType());
}
Type[] _TypeArrary = types.ToArray();
//泛型类的创建
//Type MethodType = t.MakeGenericType(entityType);
//执行泛型类的方法
MethodInfo GenericMethod = _TypeArrary.Length > 0 ? MethodType.GetMethod(methodName, _TypeArrary) : MethodType.GetMethod(methodName);
//如果不是静态方法就创建
var obj = staticflag ? null : Activator.CreateInstance(MethodType);
//参数有默认值也必须填写
//bool flag = false;
if (_TypeArrary != null && _TypeArrary.Length > 0)
return GenericMethod.Invoke(obj, parametes);
else
// return GenericMethod.Invoke(obj, new object[] { flag });
return GenericMethod.Invoke(obj, null);
}

调用实列

  ReflectionUtil.RunMethod4Dynamic(AppDomain.CurrentDomain.BaseDirectory + @"YPCMS.Framework.Database.dll", "YPCMS.Framework.Database.EfRepository", AppDomain.CurrentDomain.BaseDirectory + @"YPCMS.Framework.Entity.dll", "YPCMS.Framework.Entity.MasterData.Cargo", "GetEntityList4Cache", false, new object[] { false });
//等同于下面的方法
var   _repository=YPCMS.Framework.Database.EfRepository <YPCMS.Framework.Entity.MasterData.Cargo>();
_repository.GetEntityList4Cache(false);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至QQ邮箱:3628405936@qq.com 举报,本站将立刻删除。
(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注