工具:vs2012、.NET Reflector8.1.0.35
要解决的问题:
通过Reflector反编译生成的代码可以编译通过并显示窗体的本地资源和项目资源图片
一、测试项目
两个图片分别放在项目资源和窗体的本地资源里
项目资源文件:
<data name="Chrysanthemum" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..ResourcesChrysanthemum.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="资源" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..资源.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value> </data>
本地资源文件:
<data name="pictureBox2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value> /9j/4AAQSkZJRgABAgEAYABgAAD/7gAOQWRvYmUAZAAAAAAB/+EO5kV4aWYAAE1NACoAAAAIAAQBMgAC 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 </value>
二、Reflector 反编译
在.resources文件上点击右键=》open with=》vs2012 ,就可以在vs里查看资源文件,同时在C:ReflectorExports目录下生成.resx文件,如:
C:ReflectorExportsResxDemo.Form1.resources.resx
也可以使用resgen命令生成resx文件
选择ResxDemo项目导出源码在vs2012中打开,这时一般可以编译通过,并能运行。但是打开窗体编辑时会出现错误,提示找不到资源。
反编译后的项目和原项目对比有几点不同:
1. 原项目PropertiesResources.resx 资源文件没有了,在项目根目录下多出来一个ResxDemo.Properties.Resources.resources文件
2.原项目Form1.resx和Form2.resx资源文件没有了,多出两个.resources文件
3.原项目中有个Resources文件夹存放项目资源的图片,反编译后这个文件夹没有了
4.原项目文件.csproj中资源引用方式是这样的
<EmbeddedResource Include="Form1.resx"> <DependentUpon>Form1.cs</DependentUpon> </EmbeddedResource> <EmbeddedResource Include="Form2.resx"> <DependentUpon>Form2.cs</DependentUpon> </EmbeddedResource> <EmbeddedResource Include="PropertiesResources.resx"> <Generator>ResXFileCodeGenerator</Generator> <LastGenOutput>Resources.Designer.cs</LastGenOutput> <SubType>Designer</SubType> </EmbeddedResource>
反编译后的是这样的
<EmbeddedResource Include="ResxDemo.Form1.resources" /> <EmbeddedResource Include="ResxDemo.Form2.resources" /> <EmbeddedResource Include="ResxDemo.Properties.Resources.resources" />
*.resx文件时xml格式的资源描述文件,*.resources文件是编译后的二进制资源文件。
可以运行并显示图片是因为运行时从.resources文件中提取资源,但设计时不能读取二进制文件,所以报下面这样的错误。
类型“ResxDemo.Properties.Resources”没有名为“Chrysanthemum”的属性。
解决项目资源找不到的问题:
1.使用resgen命令生成Resources.resx文件,拷贝到Properties目录下面
2.从项目中删除ResxDemo.Properties.Resources.resources 和Resource.cs文件
3.把Resource.resx包含在项目中,双击打开,修改访问修饰符为Internal,保存一下就可以自动生成Resource.Designer.cs文件了
重新生成项目,重新打开Form1。可以看见使用项目资源的图片已经显示出来了。
这时使用本地资源的既不报错也不显示,但运行是可以显示出来的,因为现在还是使用的.resources资源文件。
解决本地资源找不到的问题:
1.使用resgen命令生成Form1.resx文件,拷贝到Form1.cs目录下面
2.从项目中删除*.Form1.resources 文件
3.从项目中包含Form1.resx文件,重新生成项目,重新打开窗体图片显示出来了。