另外,你既然能够在你的应用中使用Assembly.LoadFrom这样的方法,那test1.dll他们的路径就是已知的了,何必还要通过反射程序集内部方法来获取它的Location呢?
如果你是将test1.dll注册到了全局环境中,那么我郑裤建议你不要使用LoadFrom和LoadFile,改用Load方法:将test1和test2通过版本号或者公钥(PublicKey)加以区别,然后用Load方肆备法调用。调用参数类似于:“程序集名,Version=版本1,culture=区域信息1,PublicKeyToken=公钥1”,这是微软标准的做法。
你提到,当卸载域的时候“另一个线程还在执行这个dll里面的方法”,那么这个方法的调用方应配源该在计划卸载的域之外,这样:通过反射方法运行的代码在执行的域中(即主程序的域),这种情况下在执行域中同样加载了目标程序集(因此文件被占用),与要卸载的域锋雹无关。如果目标程培基态序集是可执行程序,则可以令新建的域执行该代码,此时,在代码执行中突然卸载域,会从执行线程上引发AppDomainUnloadException异常。
跨应用程序域访问不是一种好的设计思路。
可以做到:private void button3_Click(object sender, EventArgs e)
{
Assembly ass = Assembly.LoadFrom("ClassLibrary1.dll")//Assembly.XXXXX根据你的实际加载程猜祥序集,
Type[] types = ass.GetTypes()
foreach (Type t in types)//获取所有类型的Type,可按业务排除
{
MethodInfo[] methods = t.GetMethods(BindingFlags.Public| BindingFlags.Instance| BindingFlags.DeclaredOnly)//根据BindingFlag过滤方法
foreach(MethodInfo m in methods)
{
comboBox1.Items.Add(m)//加入到comboBox1
}
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
MethodInfo method = comboBox1.SelectedItem as MethodInfo
if (method != null)
{
listBox1.Items.Clear()
ParameterInfo[] parameters = method.GetParameters()//获取参历链数
foreach (ParameterInfo p in parameters)
{
listBox1.Items.Add(string.Format("参数名:{0},类型:{1}", p.Name, p.ParameterType))//加入参数到listBox1,可以根据p.属性获取其它信息
}
}
}
若还有疑问请加.NET初学者肢兆孙群:133212611
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)