C# 托管DLL如何调用托管宿主中的函数? 问题描述:C#程序A中需要调用C#编写的DLL,但是DLL中又需要用到A中的方法,请问如何实现?使用什么技术? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 从设计实现角度,没有什么“又需要用到A中的方法”的说法。因为对象要选择好谁是“服务”谁是“客户”,一旦选择好了那么就要单项依赖,反方向的(倒置的)沟通则通过事件机制。一旦 A 依赖于B,那么就不存在说“B调用A”的说法,而是“B要将事件(和参数)通知给自己的宿主”,这样才是比较规范的描述。 “C#编写的DLL”是可以在你所谓的“C#程序A"之前编写的,不依赖于它。不存在“调用A的方法”的说法。这样说本身其实就是复述那些不懂编程设计的用户的需求时的描述方式。 反射可以 /// <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; } DLL中需要用到宿主A中方法,---不能直接用,但可以间接用。本质和回调一样。 C#中关于命名空间的问题 跪求C#程序......求高手指导 C# 如何编译可执行程序 100分求助 C#中如何让控件失去焦点 axWebBrowser自动点击按钮问题 我把msdn上的套接字编程的例子拷贝,但是为什么客户端运行的时候,报“由于目标机器积极拒绝,无法连接”的错误 求救ASCII码转换图片 关于制作检查listbox里内容是否有更新的监视器,各位前辈进来看看 如何用C#开发扫描仪接口程序 那里可以下载水晶报表啊,谢谢 请教各位大佬,c# 中如何获取 被拔掉的USB设备的具体信息? 求助——VBA转C#程序
/// 全局通用反射示例
/// </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;
}
---不能直接用,但可以间接用。本质和回调一样。