namespace AssemblyTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Assembly asm = Assembly.LoadFrom(@"D:\AssemblyTest\Assembly1\bin\Debug\Assembly1.dll");
Type t = asm.GetType("Assembly1.FrmAssembly1");
object instance = asm.CreateInstance("Assembly1.FrmAssembly1");
//获取委托下的事件信息
EventInfo ei = t.GetEvent("et", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
//获取内嵌委托类型
Type dt = t.GetNestedType("EvenTest");
Delegate d = Delegate.CreateDelegate(dt, this, "print");
//绑定事件
ei.AddEventHandler(instance, d);
(instance as Form).ShowDialog();
}
private void print(string msg)
{
this.Text = msg;
}
}
}
namespace Assembly1
{
public partial class FrmAssembly1 : Form
{
public delegate void EvenTest(string msg);
public event EvenTest et;
public FrmAssembly1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string msg = "返回值!";
et(msg);
}
}
}

本文介绍如何使用C#动态加载外部DLL文件,并通过反射机制实例化DLL中的类,绑定并触发其内部事件。具体步骤包括使用Assembly类加载DLL,通过GetType和CreateInstance方法获取类型并创建实例,然后利用GetEvent和CreateDelegate方法绑定事件,最后显示包含事件触发功能的窗体。
524

被折叠的 条评论
为什么被折叠?



