首先提出几个问题:
★、资源是什么?分类?它的作用是什么?
★、资源在可执行文件中的存在形式是什么?
★、资源编译到文件中的过程是怎么样的?
★、多个资源在可执行文件中的分布情况是怎么样的?相同的类型的多个资源呢?不同类型的资源呢?
★、程序怎么使用在可执行文件中的资源?
★、资源在VS中的使用资源
资源是在逻辑上由应用程序部署的任何非可执行的数据。比较常见的是应用程序的图标,光标,一些控件或者窗体上的位图。
资源包括 字符串、图像和持久的对象。
资源在可执行文件或者程序集中是以二进制的形式存在的。
资源在不同的文件中的存在形式不一样,在PE文件中和程序集中形式不同。
把资源编译到可执行文件或者程序集中,有一个通用的过程。准备好源资源,比如字符串、图片等;在文件文件中按照语法格式编写脚本文件,不同的资源编译程序对应不同的语法格式;资源编译器把脚本文件和准备好的资源编译成二进制文件;语言编译器把上步的二进制文件编译到可执行程序或者程序集中。
在可执行文件或者程序集中添加资源时,有不同的具体的方式。微软给出5种在.net下的桌面应用程序中操作资源的方法;在这里。
.net中的资源。资源脚本 文件有两种形式:存在于文本文件.txt 或 .restext,存在于.resx文件;资源编译器编译后的二进制资源文件.resource;变化过程如下:
第二个参考:http://msdn.microsoft.com/zh-cn/library/ccec7sz1%28v=vs.110%29.aspx
在VS2005中。
加入外部图形资源文件引起的工程文件的变化
手动加入资源文件
加入外部图形资源文件引起的工程文件的变化
当用PictureBox组件的属性--Image添加资源文件时,通过“项目资源--导入”的方式加入,这样资源文件就在编译时直接合成的.exe或者.dll文件中了。所引起的文件变化有:
1、Properties文件夹下Resources.resx文件中添加了一项:脚本 文件。
1 <data name="xinggefenxi2013.03.13" type="System.Resources.ResXFileRef, System.Windows.Forms"> 2 <value>..Resourcesxinggefenxi2013.03.13.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> 3 </data>
name=""代表外部资源的代号;<value>中有路径是 *.jpg文件。后面应该是对此文件的说明吧。
2、Properties文件夹下Resources.Designer.cs文件中添加了如下项:
1 internal static System.Drawing.Bitmap xinggefenxi2013_03_13 { 2 get { 3 object obj = ResourceManager.GetObject("xinggefenxi2013.03.13", 4 5 resourceCulture); 6 return ((System.Drawing.Bitmap)(obj)); 7 }
这是通过资源代号来得到对应的资源,这是一个静态的属性。属性名是xingefenxi2013_03_13.
3、Form1.Designer.cs窗体配置文件中,变化如下:
1 // 2 // pictureBox1 3 // 4 this.pictureBox1.Image = global::Winform窗体资源的使用.Properties.Resources.xinggefenxi2013_03_13;//主要是这句 5 this.pictureBox1.Location = new System.Drawing.Point(-3, 0); 6 this.pictureBox1.Name = "pictureBox1"; 7 this.pictureBox1.Size = new System.Drawing.Size(559, 414); 8 this.pictureBox1.TabIndex = 0; 9 this.pictureBox1.TabStop = false;
其中一句是访问上面的属性的。
手动加入资源文件
通过上面三个地方的变化,可以手动添加一个外部资源文件,并最终编译到文件exe或者dll中。过程如下:
1、Properties文件夹下Resources.resx文件中
1 </data> 2 <data name="test" type="System.Resources.ResXFileRef, System.Windows.Forms"> 3 <value>..Resources11.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> 4 </data>
直接添加一项,注意那个路径11.png要对应上。
2、Properties文件夹下Resources.Designer.cs文件中
1 internal static System.Drawing.Bitmap gg{ 2 get { 3 object obj = ResourceManager.GetObject("test", resourceCulture); 4 return ((System.Drawing.Bitmap)(obj)); 5 } 6 }
属性名设置为gg
3、这时就可以在代码中得到属性对应的资源了,在一个Button的事件中
1 private void button1_Click(object sender, EventArgs e) 2 { 3 pictureBox2.Image = global::Winform窗体资源的使用.Properties.Resources.gg; 4 }
结果就能动态显示图片了。并且把.exe移动到其他文件夹下也可以正常显示,可见已经植入到程序中了。
添加光标文件
只在Resources.resx中添加脚本代码:
<data name="cursor" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..chat.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data>
编译后就会自动生成:
1 internal static System.Drawing.Icon cursor { 2 get { 3 object obj = ResourceManager.GetObject("cursor", resourceCulture); 4 return ((System.Drawing.Icon)(obj)); 5 } 6 }