微软作了决定, 从它第一天发家起就是文件名/目录名大小写不敏感.
但是, 在.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测试条目, 保证程序中对资源名的使用总是正确的.
阅读(1215) | 评论(0) | 转发(0) |