c程序调用python (c程序怎么调用文件)

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);