工具:vs2012、.NET Reflector8.1.0.35
要解決的問題:
通過Reflector反編譯生成的代碼可以編譯通過並顯示窗體的本地資源和項目資源圖片
一、測試項目
兩個圖片分別放在項目資源和窗體的本地資源里
項目資源文件:
<data name="Chrysanthemum" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Resources\Chrysanthemum.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:\Reflector\Exports目錄下生成.resx文件,如:
C:\Reflector\Exports\ResxDemo.Form1.resources.resx
也可以使用resgen命令生成resx文件
選擇ResxDemo項目導出源碼在vs2012中打開,這時一般可以編譯通過,並能運行。但是打開窗體編輯時會出現錯誤,提示找不到資源。
反編譯后的項目和原項目對比有幾點不同:
1. 原項目\Properties\Resources.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="Properties\Resources.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文件,重新生成項目,重新打開窗體圖片顯示出來了。