最近在做个东东,有点类似于写程序的插件..大概的思路是:
做个应用程序(也可以说是外壳),主要用于扫描某个目录,
如果发现有相应的类库(dll文件)就尝试用反射去实例化他,然后运行..
由于要求类库中可以传件消息到应用程序外边来..
所以使用到了委托..问题也就出现在委托这里..我想请教各位达人,
怎么用反射去实例化一个委托?
还有..怎么传个方法名称进去?第一次用反射,问题多多..(汗一下自己)
希望对这方面有经验的达人赐教一下,谢谢!程序大概如下(临时写的例子,可能有错.请见谅)-------------------------------------------------------------------下面是类库(DLL文件)里的代码:public delegate void SendMessageDelegate( string msg );
public class App
{
SendMessageDelegate SendMsg;
public SendMessageDelegate SetMethod
{
set{ SendMsg = value; }
} private void AppStart()
{
while( true )
{
//委托,调用应用程序那边的SendMessage方法
SendMsg( "测试测试测试测试" );
}
}
}----------------------------------------------------------------------下面是应用程序的代码:public class AA
{ // 省略了构造函数,主函数,等等等等....
private void SendMessage( string msg )
{
txtMsg.AppendText( msg );
}
private void LoadApplication( )
{
Assembly assembly = Assembly.LoadFile( "App.dll" );
Type[] types = assembly.GetTypes();
Type typeApp = null;
Type typeDele = null;
foreach( Type type in types )
{
if( type.Name == "App" )
{
typeApp = type;
}
else if( type.Name == "SendMessageDelegate" )
{
typeDele = type;
}
} // ### 怎么实例化 SendMessageDelegate 委托? ###
object oApp = typeApp.InvokeMember( null, BindingFlags.CreateInstance, null, null, new object[0] );
// ### 怎么将委托传进去? ###
//typeApp.InvokeMember( "SetFunction", BindingFlags.SetProperty, null, oApp, new object[]{} );
typeApp.InvokeMember( "AppStart", BindingFlags.InvokeMethod, null, oApp, new object[0] );
}
}
做个应用程序(也可以说是外壳),主要用于扫描某个目录,
如果发现有相应的类库(dll文件)就尝试用反射去实例化他,然后运行..
由于要求类库中可以传件消息到应用程序外边来..
所以使用到了委托..问题也就出现在委托这里..我想请教各位达人,
怎么用反射去实例化一个委托?
还有..怎么传个方法名称进去?第一次用反射,问题多多..(汗一下自己)
希望对这方面有经验的达人赐教一下,谢谢!程序大概如下(临时写的例子,可能有错.请见谅)-------------------------------------------------------------------下面是类库(DLL文件)里的代码:public delegate void SendMessageDelegate( string msg );
public class App
{
SendMessageDelegate SendMsg;
public SendMessageDelegate SetMethod
{
set{ SendMsg = value; }
} private void AppStart()
{
while( true )
{
//委托,调用应用程序那边的SendMessage方法
SendMsg( "测试测试测试测试" );
}
}
}----------------------------------------------------------------------下面是应用程序的代码:public class AA
{ // 省略了构造函数,主函数,等等等等....
private void SendMessage( string msg )
{
txtMsg.AppendText( msg );
}
private void LoadApplication( )
{
Assembly assembly = Assembly.LoadFile( "App.dll" );
Type[] types = assembly.GetTypes();
Type typeApp = null;
Type typeDele = null;
foreach( Type type in types )
{
if( type.Name == "App" )
{
typeApp = type;
}
else if( type.Name == "SendMessageDelegate" )
{
typeDele = type;
}
} // ### 怎么实例化 SendMessageDelegate 委托? ###
object oApp = typeApp.InvokeMember( null, BindingFlags.CreateInstance, null, null, new object[0] );
// ### 怎么将委托传进去? ###
//typeApp.InvokeMember( "SetFunction", BindingFlags.SetProperty, null, oApp, new object[]{} );
typeApp.InvokeMember( "AppStart", BindingFlags.InvokeMethod, null, oApp, new object[0] );
}
}
解决方案 »
- Microsoft JScript 运行时错误: 找不到成员。纠结死了!!
- 网站获取的json数据 怎么 解析
- 提单时获取org.apache.struts.taglib.html.TOKEN
- 选择了C#,专注于WINFORM,才发现原来WEBFORM才是王道。。。。
- 如何实现后台权限管理
- 执行sql查询的问题
- 删除数据行后再操作表的问题
- 如何使用OfficeXP PIAs把打开的Word文档保存进SQL数据库中Image域的字段
- vs2003下的水晶报表发布到 win98 下执行总是提示“加载报表失败”,vs2002下没问题。
- 在DataSet中选择性的在DataGrid中显示相应几列
- 手机号码有没有什么规律?
- !!!请教大侠!动态创建类
Delegate.CreateDelegate(delegateType, targetMethodInfo, targetMethodName)).DynamicInvoke(new object[](...));
如果delegate没有参数那就传null进去。具体格式应该你们自己定的,你应该可以写出来要传什么。
以下代码通过
object oApp = typeApp.InvokeMember(null, BindingFlags.CreateInstance, null, null, new object[0]);
Delegate dele=Delegate.CreateDelegate(typeDele,this,"SendMessage");
typeApp.GetProperty("SetMethod").SetValue(oApp, dele, null);
MethodInfo[] infos=typeApp.GetMethods(BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Instance );
foreach (MethodInfo info in infos)
{
if (info.Name == "AppStart")
{
info.Invoke(oApp, new object[] { });
}
}