注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

分享,态度 ·~~

—— 十年太长,五年;如果可以回到五年前,你最想对那时候的自己说什么?

 
 
 

日志

 
 

c#代码中调用资源  

2009-08-26 15:53:13|  分类: DotNet |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在好多的C#和.Net的论坛中都会提到如何使用内嵌资源的话题,对大多一般的数项目来说,这也许更不就不是一个问题.但是,对于一些复杂的项目,这也许就成了问题.本文会把论坛中的内容汇总一下,比起查询论坛来,文章显得更容易查找和连接.  
第一件清楚的事情  
在VS.Net中,有多种使用资源文件的方法,最常用的方法是让Form来保存它所使用的资源文件,这个可以通过产生一个.resx文件来保存Form所用到的资源.本文不是讨论这个话题,因为通常开发人员不会关心这个简单的问题.  
第二种方法是使用资源文件,本文重点在这儿,包括如何在资源文件中添加文件,如何设置内嵌资源的”生成类型”.  
名称是如何规定的?  
当你使用内嵌资源文件时,通常要知道资源的名称.实际上它可以像一个文件名,但是通常会比文件名更复杂一点点.  
命名一般包括三个部分:<缺省的命名空间.><扩展命命名空间.><文件名>  
上面的第一部分和最后的第三部分都好理解.   缺省的命名空间就是项目的命名空间,文件名就是资源文件的名称.中间的这部分可能有些迷惑.    
简单的讲,扩展命名空间就是项目中的目录结构.如果你的资源文件就在项目的根目录下,扩展命名空间就不需要了,直接这样写就可以了.   <缺省的命名空间.>   <文件名>.   但是如果你在项目中产生目录结果的话,就要使用使用扩展命名空间了.比如你在项目的根目录下产生了一个Images目录,那么资源文件就要这样来表示:   <缺省的命名空间.>   Images.<文件名>.   如果你在Images路径下还有一个目录FormGraphics,那么资源文件就要这样表示:   <缺省的命名空间.>   Images.FormGraphics.<文件名>  
我想大家可能已经发现了上面的规律,在代码中你也可以这么写.当你在目录下使用VS自动产生了类,它也是安装这样的方式来命名类的名称.   <缺省的命名空间.><扩展命命名空间.>.   虽然你可以手工的修改代码中的命名空间,但是有一点要记住,是不可以修改内嵌资源文件的命名空间结构的.  
如何得到资源  
普通方法  
普通的使用内嵌资源文件的方法是使用Assembly类的GetManifestResource方法.在第一个演示程序中,我们会使用下面这两个方法GetManifestResourceNames,   GetManifestResourceStream  
这个演示程序会列举出一个装配件中的资源,可以把存选中的资源保到一个文件中.如果资源是一个图象,在程序中就可以显示出来.如果你还没有一个内嵌资源的装配件,第二个演示程序就是一个含有资源的装配件.  
这是在ListBox的   ListBox's   SelectedIndexChanged   事件中,如果出来资源  
System.IO.Stream   stream   =   loadedAssembly.GetManifestResourceStream(  
       (string)   resources.SelectedItem);  
System.Drawing.Image   img   =   Image.FromStream(stream);  
上面的演示程序把一个装配件调入内存,在loadedAssembly变量中存储一个Assembly实例.也许在你的应用程序中,不需要调用其他装配件的资源,你只是想能从你自己的程序中得到资源.  
最简单的方法是使用Type类的Assembly属性来得到某一个类的一个实例,你可以用下面的方法来得到Type,如果是一个类,使用typeof(<class>),如果是一个类的实例变量,使用GetType().  
另一种实现方法  
GetManifestResourceStream有两种重载方法,一种是从一个资源文件中来得到一个Stream对象,   另一个中使用Type和string.   第二个会帮助我们得到可以使用的资源.它会根据清单资源的范围由指定类型的命名空间确定资源清单  
第二个演示程序是利用上面说得第二个方法来实现的.  
总结  
当你理解了上面的内容后,对于VS.net内嵌资源的使用就是易于反掌了.唯一要注意的地方就是找出VS.Net给你的资源文件的名字.  
【from http://topic.csdn.net/t/20030325/12/1573610.html

在下面段code中,我从程序集中得到了ico文件的数据流,而Icon函数可以接受这个形式的变量:

        System.Windows.Forms.NotifyIcon nIcon;
        private void NotifyIconShow()
        {
            nIcon = new System.Windows.Forms.NotifyIcon();
            Assembly asm = Assembly.GetExecutingAssembly();
            Stream str = asm.GetManifestResourceStream("Dock.resource.notifyicon.ico");
            Icon ic = new Icon(str);
            str.Close();
            nIcon.Icon = ic;
 
 。。。。

  评论这张
 
阅读(646)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017