C#反射问题求助(在线求助)

yibey 2011-10-12 10:46:02

Assembly ass;
ass = System.Reflection.Assembly.Load("TestLibrary");
obj = ass.CreateInstance("TestLibrary.TestForm");//必须使用名称空间+类名称
obj = ass.CreateInstance("TestLibrary2.Form1");

首先我已经生成了2个dll 一个是TestLibrary 还有一个TestLibrary2。并且TestLibrary引用了TestLibrary2。

那么请问反射里load方法有一句话,通过这个方法加载的程序集比如TestLibrary,那么它会同时加载该程序集引用的程序集。
那么为什么我测试上面的代码的时候
执行到obj = ass.CreateInstance("TestLibrary.TestForm");这个是成功了
执行到obj = ass.CreateInstance("TestLibrary2.Form1");失败了。
(注,这里的窗体类都是有的)
...全文
143 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ailin84 2011-10-14
  • 打赏
  • 举报
回复
楼主,.. caozhy说的是正确的

引用其实没啥用的,只是IDE开发环境需要


如果是反射的话,就需要加载执行的那个方法的dll

如果是普通调用程序,在.net里你只需要把dll文件放到bin目录就可以了,不引用程序照样能执行,只是你的ide开发环境会报错
yibey 2011-10-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 caozhy 的回复:]
说到底,“引用”和“加载”是两个概念。

引用只是告诉编译器,识别定义在外部库中的符号,使得编译通过。
而“加载”是CLR去做的,什么时候加载,加载什么,加载一部分还是全部,都是根据运行时的需要决定。
所以绝不能因为某个库在编译的时候“引用”,就认定它可以自动加载什么。实际上就算加载,也和间接引用的库没有什么关系。

另外,我说下我个人的猜测,这个和安全性也有关系。假设攻击者篡改了一个……
[/Quote]

楼上的我不知道你看过反射里的load方法和loadfile方法没,你这样解释等于什么都没说
threenewbee 2011-10-13
  • 打赏
  • 举报
回复
说到底,“引用”和“加载”是两个概念。

引用只是告诉编译器,识别定义在外部库中的符号,使得编译通过。
而“加载”是CLR去做的,什么时候加载,加载什么,加载一部分还是全部,都是根据运行时的需要决定。
所以绝不能因为某个库在编译的时候“引用”,就认定它可以自动加载什么。实际上就算加载,也和间接引用的库没有什么关系。

另外,我说下我个人的猜测,这个和安全性也有关系。假设攻击者篡改了一个库,它引用了攻击者精心构造的伪造的FCL,那么调用者可能在无法察觉的情况下执行不安全的代码。比如攻击者写了一个产生随机数的算法代替系统库的算法,并且每次都返回一个固定的数,而你的程序的加密算法依赖它产生密钥,后果是严重的。

而且你怎么会这么去想,很奇怪。比如说,你引用几个Web控件,它们必然都使用了System.Web,你的程序就不用引用了么?
yibey 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 caozhy 的回复:]

晕。。。当然不行。

之前有一个人问的和你不同,他说他在开发环境要引用很多dll很麻烦,能不能写一个dll引用它们,然后在项目里面直接引用这个引用了其他dll的dll。当然同样不行。
[/Quote]

为什么不行呢,Load这个方法里明明说可以加载到B中加载的C,不懂,求解释
threenewbee 2011-10-12
  • 打赏
  • 举报
回复
晕。。。当然不行。

之前有一个人问的和你不同,他说他在开发环境要引用很多dll很麻烦,能不能写一个dll引用它们,然后在项目里面直接引用这个引用了其他dll的dll。当然同样不行。
showjim 2011-10-12
  • 打赏
  • 举报
回复
Assembly.LoadForm
yibey 2011-10-12
  • 打赏
  • 举报
回复
没人理我了
yibey 2011-10-12
  • 打赏
  • 举报
回复
大虾们谁知道这个解释是什么意思
??
Load方法什么叫 加载了B.dll,如果B引用了C,那么C也会被加载
同样情况下在方法loadfile中 C不会被加载。这2者是什么意思
yibey 2011-10-12
  • 打赏
  • 举报
回复
这个找了很多信息,Y的就没人直接说明这个怎么解释的
枪牌 2011-10-12
  • 打赏
  • 举报
回复
B中引用了C

你的A加载B,如果C不加载到当前程序中,显然会因为B缺少依赖项(执行到的情况下)而运行失败

不过你的例子俺就说不清楚了,等牛人
yibey 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mabaolin 的回复:]
ass = System.Reflection.Assembly.Load("TestLibrary2");也加载看看
[/Quote]
这个当然没问题了,我只是想验证下load方法里说的只要加载了一个DLL,这个dll引用过C.DLL,那么C.DLL也会被加载到当前程序。我如何去验证这个事
mabaolin 2011-10-12
  • 打赏
  • 举报
回复
ass = System.Reflection.Assembly.Load("TestLibrary2");也加载看看

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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