Assembly .getType为空,反射问题

sohighthesky 2010-04-01 08:21:10
大家好,今天被愚到了没?

问题代码:


Assembly ass = Assembly.LoadFile(Server.MapPath("~/bin/") + "ZJSWeb.dll");
Type type = ass.GetType("ZJSWeb.CheckLogin");
MethodInfo method = type.GetMethod("UserLogin");//这一行报错,type为空,
method.Invoke(null, new object[] { TextBox1.Text, TextBox2.Text, this });


ZJSWeb.dll是一个web应用程序类,里面有ZJSWeb.CheckLogin这个类
且有UserLogin方法
上面的代码是新建的一个web程序程序TestPro里执行的,
两个项目分别发布后,我将TestPro的Default.aspx和TestPro.dll复制 到了ZJSWeb这个项目里执行,就出现了上面的错误

大家看看这是怎么回事?
另外我是想做公司网站的一个登录模块
需求是将网站里的其它应用都使用同一个登录页面,所以我想,每添加一个应用时,将类文件路径和登录调用方法等信息放入xml中,登录界面读取要登录的应用,然后调用相应的dll登录方法来实现登录,就出来了上面的问题,
或者大家有没有其它的方法来满足这个需求的
感谢你的回复,
ps:如果觉得分少可以提出来加,
...全文
481 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sohighthesky 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wu_microsoft 的回复:]
首先你先反射下看看有没有这个CheckLogin类

你想得到方法 而程序是不知道方法有几个参数的 !

Type.GetMethod (String, Type[])

你必须指定所有参数的类型才能得到方法哦!

搜索其参数与指定参数类型匹配的指定公共方法。

然后才能 Invoke(Object, Object())
[/Quote]
这个我试过了,可以不加后面的Type数组的,后面的Invoke指定了参数,.net应该知道怎么重载的吧
阿非 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sohighthesky 的回复:]
直接 写成CheckLogin就ok,叫2个郁闷
[/Quote]

一开始我是想说这个来着,岔开了。
阿非 2010-04-01
  • 打赏
  • 举报
回复
void =》 bool
sohighthesky 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sandy945 的回复:]
ZJSWeb.dll

这个dll 提供个链接,我试下
[/Quote]

直接 写成CheckLogin就ok,叫2个郁闷


阿非再帮忙看下

public static void UserLogin(string user, string pwd,Page page)
{
if(数据库里验证)
{
HttpContext.Current.Session["zjsuser"] = user;
page.ClientScript.RegisterStartupScript(page.GetType(), "lg", "location.href='"+page.ResolveUrl("~/")+"demo/kerrydemo/Default.aspx'", true);//这里这句跳转的路径有点不好,我现在是写在这个方法里,但是这样在调试时候又不方便,有可能开始根本没有这样路径,
如果让这个方法返回一个字符串让外面 来处理的话,感觉也不太好,不知道有没好点的思路,谢谢,
}
else
{
page.ClientScript.RegisterStartupScript(page.GetType(), "ErrMsg", "window.alert('用户名或密码错误!');", true);
}
}
wu_microsoft 2010-04-01
  • 打赏
  • 举报
回复
Type type = System.Web.Compilation.BuildManager.GetType("ZJSWeb.CheckLogin", false, true);
Type[] types={typeof(string),typeof(string),typeof(System.Web.UI.Page)};
MethodInfo methodInfo = type.GetMethod(countMethodName, types[]);
object[] parameters{参数1,参数2,参数3};
if (methodInfo.IsStatic)
{
methodInfo.Invoke(null, parameters);
}
else
{
object instance = Activator.CreateInstance(type);
methodInfo.Invoke(instance, parameters);
}
阿非 2010-04-01
  • 打赏
  • 举报
回复
ZJSWeb.dll

这个dll 提供个链接,我试下
sohighthesky 2010-04-01
  • 打赏
  • 举报
回复
CheckLogin没有命名空间
我看.net的对象资源管理器中是ZJSWeb下面的CheckLogin所以就写成上面那样了
但是刚用Reflector看
却是ZJSWeb.-.CheckLogin
写成这样试了,还是一样的错误。
wuyq11 2010-04-01
  • 打赏
  • 举报
回复
反编译ZJSWeb.dll看看
Type.GetType只会在当前程序集中进行类型搜索
Assembly a = Assembly.LoadFrom("A.dll");
Type t = a.GetType("ClassLibrary1.Class1");
sohighthesky 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sandy945 的回复:]
Type type = ass.GetType("ZJSWeb.CheckLogin");

---------------
看看是不是命名空间的问题
[/Quote]
这个我添加引用看了的,是正确的
sohighthesky 2010-04-01
  • 打赏
  • 举报
回复
晕,看了你的回复method= type.GetMethod("UserLogin",new Type[]{typeof(string),typeof(string),typeof(System.Web.UI.Page)});试了几次还是不行。。。。。

这一行报的错误是type为null,未将对象引用到设置的实例
所以方法都还没执行到呢。

阿非 2010-04-01
  • 打赏
  • 举报
回复
Type type = ass.GetType("ZJSWeb.CheckLogin");

---------------
看看是不是命名空间的问题
wu_microsoft 2010-04-01
  • 打赏
  • 举报
回复
另外如果方法是静态的话

methodInfo.IsStatic

Invoke(null, Object[])

第一个参数可以为NULL哦
wu_microsoft 2010-04-01
  • 打赏
  • 举报
回复
首先你先反射下看看有没有这个CheckLogin类

你想得到方法 而程序是不知道方法有几个参数的 !

Type.GetMethod (String, Type[])

你必须指定所有参数的类型才能得到方法哦!

搜索其参数与指定参数类型匹配的指定公共方法。

然后才能 Invoke(Object, Object())
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 第三方公司插件 { using 记事本公司提供的插件标准; public class PlugOne:IPlug { public string PlugName { get { return "全部变成大写"; } } public string ProcessText(string strOri) { return strOri.ToUpper(); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 第三方公司插件 { using 记事本公司提供的插件标准; public class PlugTwo:IPlug { public string PlugName { get { return "全部变成小写"; } } public string ProcessText(string strOri) { return strOri.ToLower(); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 记事本公司提供的插件标准 { public interface IPlug { string ProcessText(string strOri); string PlugName { get; } } } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 记事本主程序 { using System.Reflection; using System.IO; using 记事本公司提供的插件标准; public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //获取正在运行的程序集 Assembly ass = Assembly.GetExecutingAssembly(); //获取程序集的4种方法 //Assembly ass1 = this.GetType().Assembly; //Assembly[] asses = AppDomain.CurrentDomain.GetAssemblies();

62,073

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧