Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2347096
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2008-07-15 22:06:11

微软作了决定, 从它第一天发家起就是文件名/目录名大小写不敏感.

但是, 在.NET中, 如果项目中内嵌了一个文件系统中的资源, 比如图像, 图标, 光标, 二进制文件等等, 编译后在Assembly中的资源名来源于几个因素:
项目默认的Namespace名字, 资源在项目中相应的路径名, 以前资源文件本身的名字. 最终生成的这个资源名是以.分隔的一个名称, 最直接简便的办法是, 先编译出最终的exe或dll, 然后用reflector查看其生成的资源名, 然后把这个资源名copy出来, 在代码里这样获取:
Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("XXX.YYY.ZZZ.UP_Hover.png");

其中获取到的这个 imageStream, 就是原始文件的内容. 一字不差.

非常容易引起问题的是这个文件名, 如上例中, UP_Hover.png 部分是资源名, .NET编译器生成这样的名字是因为在文件系统中的确切名字是UP_Hover.png, 即使你用up_hover.png 也可访问得到.

但在获取资源时, 如果大小写不对, 你一样会得到null.

以上是直接向项目中添加一个内嵌资源时的情况, 如果是添加一个文件链接, 情况更复杂:
1. 下图中VS项目中显示的名称与Properties窗口中显示的资源名都与 .csproj项目文件中的 Include 这个 Attribute保持一致, 但却不是最终生成的资源名.
2. 最终生成的资源名是图中的节点中的内容
3. 前两者都可以和文件系统中的文件名的大小写不一致.




推荐的做法是:
1. 在程序中编码资源名时, 不要去根据默认名字空间, 资源所在的目录, 以及资源名等等去推断. 先随便写一个. 最好写成是一个明显错误的名字
2. 编译项目
3. 用reflector打开项目查看资源名. 把资源名copy出来. 替换原来在项目中随便写的那个错误的资源名.
4. 写一个nunit测试条目, 保证程序中对资源名的使用总是正确的.
阅读(1198) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~