日期:2014-05-19  浏览次数:21028 次

反射 调类cs文件没事,但是调用DLL出错高分
以前我是这么调用的,调用的都是我包含在项目里面的cs文件,这些文件都是UserControl,是cs但是没有编译成dll.这样调用没问题.
string   str= "water.sysmanage.datasave ";
Type   t   =   Type.GetType(str);  
UserControl   control=(UserControl)Assembly.GetExecutingAssembly().CreateInstance(str);  
if(control!=null)
        this.panelfill.Controls.Add(control);

后来想分开做功能,其他组员给我UserControl编译好的dll但是调用不成功以下是调用代码,请高手分析下.就是想把这个dll进行实例化然后填充到panel里面

//读取选择指定的dll文件
string   strPath   =   @ "D:\DDLinfo\bin\Debug\datasave.dll ";
string   NameSpace   =   "water.sysmanage.datasave ";
//加载指定的程序集之内存中
Assembly   assembly   =   Assembly.LoadFrom(strPath);
//返加程序集中的一个指定的对象,哪果是返回所有对象,则用GetTypes()返回一个Typt对象的数组.
Type   T   =   assembly.GetType(NameSpace);
//根据前面type类型创建一个对象   *******************下面这行报错.调用发生异常
UserControl   control   =   (UserControl)Activator.CreateInstance(T);

if   (c   !=   null)
                            this.panelfill.Controls.Add(control);


我就是想把个   UserControl的dll     fill到panel里面     大家多指点

------解决方案--------------------
assembly.CreateInstance(namespace)
------解决方案--------------------
mark
------解决方案--------------------
assembly.CreateInstance(T.FullName);
------解决方案--------------------
Activator.CreateInstance(T)这个方法只能用于本程序集中有的类型,如果这个程序集中没有的类型是不能这样创建的。
------解决方案--------------------
支持
------解决方案--------------------
什么错误?
------解决方案--------------------
UserControl control = ((UserControl)Activator).CreateInstance(T);
这样试试。
------解决方案--------------------
GetExecutingAssembly得到的应该是当前正在执行的程序集.

你分开之后当然找不到了.

要先Load那个程序集.再取类型.
------解决方案--------------------
先用Assembly把程序集Load进来就可以了
------解决方案--------------------
agree with you
------解决方案--------------------

Activator.CreateInstance(T)这个方法只能用于本程序集中有的类型,如果这个程序集中没有的类型是不能这样创建的。

assembly.CreateInstance(namespace)