C#如何动态给dll中的类的一个属性赋值?

friendan 2013-04-28 08:53:07
事情是这样的,我有一个C#皮肤的dll文件,正常情况下是这样使用的:
Sunisoft.IrisSkin.SkinEngine skin = null;
skin = new Sunisoft.IrisSkin.SkinEngine(((System.ComponentModel.Component)(this)));
skin.SkinFile = path + @"\CA_Skin.ssk";
//前后省掉部分代码
------------------------------------------------------------------
现在为了方便,我把该dll文件作为了资源文件,程序运行时,动态释放到System32目录下,
文件CA_Skin.ssk也是释放到了system32目录下面。
--------------------------------------------------------------------------
现在我想动加载该dll文件,发现加载不了。网上查了很多资料,说是可以通过发射来动态加载和
调用dll中的类和方法,我试了下,出现错误,我测试时的代码如下:

//利用反射进行动态加载和调用.
//利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll
Assembly ass = Assembly.LoadFrom(path + @"\IrisSkin2.dll");

//加载dll后,需要使用dll中某类.
//利用类型的命名空间和名称获得类型
Type type = ass.GetType("Sunisoft.IrisSkin.SkinEngine");
MessageBox.Show("type=" + type.ToString());//经测试,成功获得类型

//需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
//利用指定的参数实例话类型
Object obj = Activator.CreateInstance(type,((System.ComponentModel.Component)(this)));
//Object obj = Activator.CreateInstance(type);//这样写也不行
MessageBox.Show("obj=" +obj.ToString());

//得到及设置属性
System.Reflection.FieldInfo fi= type.GetField("SkinFile");
fi.SetValue(obj, path + @"\AutoAccessQzone_Skin.ssk");

--------------------------------------------------------------------------
错误的原因是没有获得类的实例,问题在这行代码:
Object obj = Activator.CreateInstance(type,((System.ComponentModel.Component)(this)));
现在,我不知道如何改正,望知道的大虾指点一二。
------------------------------------------------------------------------------
程序运行时错误截图如下:


...全文
673 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2013-04-29
  • 打赏
  • 举报
回复
外部的程序集 Activator.CreateInstance -> Assembly.CreateInstance
friendan 2013-04-29
  • 打赏
  • 举报
回复
没人顶,分只好给版主了。
friendan 2013-04-29
  • 打赏
  • 举报
回复
呵呵,经过努力,我自己解决了该问题,原来是我在获取属性的代码时使用了错误的方法。 ------------------------------------------------------------------------------- 修改后的代码如下:

//加载dll中的程序集; 
 Assembly ass = Assembly.LoadFrom(path + @"\IrisSkin2.dll"); 

 //获取所要使用的类
 Type type = ass.GetType("Sunisoft.IrisSkin.SkinEngine");

 //实例化类
 Object obj = Activator.CreateInstance(type,((System.ComponentModel.Component)(this))); 
                                                
  //从类中获取属性
  //System.Reflection.FieldInfo fi = type.GetField("SkinFile");//原来我用的是这行代码,所以出错
  System.Reflection.PropertyInfo fi = type.GetProperty("SkinFile");//获取类中的属性,用这行代码
               
 //设置属性
 fi.SetValue(obj,path + @"\AutoAccessQzone_Skin.ssk",null);
friendan 2013-04-29
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
外部的程序集 Activator.CreateInstance -> Assembly.CreateInstance
--------------------------------------- 我改成用Assembly.CreateInstance()来创建实例也还是上面那个错误, 真是不知道问题出在哪里了。 ---------------------------------------------- 以下代码都试过了,都不行:

 Object obj = ass.CreateInstance(type.ToString(), 
                                                false,
                                                System.Reflection.BindingFlags.CreateInstance&System.Reflection.BindingFlags.SetField, 
                                                null, 
                                                new object[] { (System.ComponentModel.Component)(this)},
                                                null, 
                                                null);
----------------------------------------------

 Object obj = ass.CreateInstance(type.ToString(), 
                                                false,
                                                System.Reflection.BindingFlags.CreateInstance
                                                null, 
                                                new object[] { (System.ComponentModel.Component)(this)},
                                                null, 
                                                null);
----------------------------------------------------------------

Object obj = ass.CreateInstance(type.ToString(), 
                                                false,
                                                System.Reflection.BindingFlags.SetField
                                                null, 
                                                new object[] { (System.ComponentModel.Component)(this)},
                                                null, 
                                                null);
---------------------------------------------------------------------

Object obj = ass.CreateInstance(type.ToString()); 

111,092

社区成员

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

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

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