dll文件的代码如下:保存在"C:\a.dll"
namespace ClassLibrary2
{
public class Class1
{
public event EventHandler Event1;
private string eventrase;
public string Eventrase
{
get
{ return eventrase; }
set
{
if (Event1 != null)
Event1(this, null);
eventrase = value;
}
}
public string returnStr(string str)
{
return "经过反射的:" + str;
}
}
}
主程序代码如下:
namespace ConsoleApplication5
{
class Program
{
private static Assembly openDll;
private static dynamic readDll;
static void Main(string[] args)
{
var filename = @"C:\a.dll";
openDll = Assembly.LoadFile(filename);
readDll = openDll.CreateInstance("ClassLibrary2.Class1", true, BindingFlags.CreateInstance, null, null, null, null);
//调用有返回值的方法
Console.WriteLine(readDll.returnStr("ddd"));
//触发事件
//readDll.Event1+=new EventHandler(EEE);
Console.ReadKey();
}
//void EEE(object sender, EventArgs e)
// {
// throw new NotImplementedException();
// }
}
}
在主程序中,利用dynamic类型成功调了returnStr方法,但如何才能触发dll文件中的事件呢?
注释掉的部分不好使,提示错误。
------解决思路----------------------
readDll.Eventrase = "给老子触发事件!" ;
介样就行了
------解决思路----------------------
反射之后不是可以获取到类的每个属性跟方法吗
------解决思路----------------------
我用button滴click 为例子写个demo,自己看吧
dynamic t = this.button1;
t.Click += new System.EventHandler(button1_Clicktest);
------解决思路----------------------
你又没注册事件,在你注销的那段注册方法下面添加1L的属性设置代码
------解决思路----------------------
当然你本身的代码就是对的,至于不是你想滴,那是你理解错了
t.Click +=xxxx 这块是挂接事件处理代码,而非你认为滴事件触发代码
根据你上面的对象写法,你的事件触发,应该是为Eventrase属性赋值就可以了
------解决思路----------------------
namespace ClassLibrary1
{
public class Class1
{
public event EventHandler Event1;
private string eventrase;
public string Eventrase
{
get
{ return eventrase; }
set
{
eventrase = value;
if (Event1 != null)
Event1(eventrase, null);
}
}
public string returnStr(string str)
{
return "经过反射的:" + str;
}
}
}
class Program
{
private static Assembly openDll;
private static dynamic readDll;
static void Main(string[] args)
{
var filename = @"C:\a.dll";
openDll = Assembly.LoadFile(filename);
readDll = openDll.CreateInstance("ClassLibrary1.Class1", true, BindingFlags.CreateInstance, null, null, null, null);
//调用有返回值的方法
Console.WriteLine(readDll.returnStr("ddd"));
//触发事件
readDll.Event1 += new EventHandler(Event);
readDll.Eventrase = "exec";
Console.ReadKey();
}
private static void Event(object sender, EventArgs e)
{
Console.WriteLine(sender.ToString());
}
}