最近在做个东东,有点类似于写程序的插件..大概的思路是:
做个应用程序(也可以说是外壳),主要用于扫描某个目录,
如果发现有相应的类库(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] );
    } 
}

解决方案 »

  1.   

    Delegate.CreateDelegate(delegateType, targetMethodInfo, targetMethodName));
      

  2.   

    至于触发delegate,就是这样了:
    Delegate.CreateDelegate(delegateType, targetMethodInfo, targetMethodName)).DynamicInvoke(new object[](...));
    如果delegate没有参数那就传null进去。具体格式应该你们自己定的,你应该可以写出来要传什么。
      

  3.   

    你把AppStart弄成private已经不能像你那样调用了
    以下代码通过
    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[] { });
                    }
                }
      

  4.   

    感谢3F的jointan,问题已经解决..