问题描述:C#程序A中需要调用C#编写的DLL,但是DLL中又需要用到A中的方法,请问如何实现?使用什么技术?

解决方案 »

  1.   

    从设计实现角度,没有什么“又需要用到A中的方法”的说法。因为对象要选择好谁是“服务”谁是“客户”,一旦选择好了那么就要单项依赖,反方向的(倒置的)沟通则通过事件机制。一旦 A 依赖于B,那么就不存在说“B调用A”的说法,而是“B要将事件(和参数)通知给自己的宿主”,这样才是比较规范的描述。
      

  2.   

    “C#编写的DLL”是可以在你所谓的“C#程序A"之前编写的,不依赖于它。不存在“调用A的方法”的说法。这样说本身其实就是复述那些不懂编程设计的用户的需求时的描述方式。
      

  3.   

    反射可以        /// <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;
            }
      

  4.   

    DLL中需要用到宿主A中方法,
    ---不能直接用,但可以间接用。本质和回调一样。