ResourceWriter rw = new ResourceWriter("My.resources");//资源文件名称Image img1 = Image.FromFile("Photo1.jpg");
Image img2 = Image.FromFile("Photo2.jpg");//以下是在资源文件中加入图象
rw.AddResource("Photo1", img1);
rw.AddResource("Photo2", img2);rw.Generate(); //产生一个资源文件
rw.Close();
我用这些代码生成了一个名叫My.resources的资源文件
请问怎么读取里面的图片呀??
我只需要一点击Button1,然后在PictureBox1里显示那张图片出来就行了代码应该怎么写??ResourceManager rm = new ResourceManager("My.resources", Assembly.GetExecutingAssembly());
PictureBox1.Image = (Image)rm.GetObject("Photo1");我直接在Button1的事件中写这些代码的话,会出错,显示如下:
未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“My.resources.resources”正确嵌入或链接到程序集“TestForm”,或者确保所有需要的附属程序集都可加载并已进行了完全签名。应该怎么写?

解决方案 »

  1.   

    是不是要首先获取My.resources得路径?
      

  2.   

    你读取资源文件的方法有问题,编译成.resource文件的并不是一个程序集,必须编译成程序集才可以用你的那个方法使用。从Resourcemanager的构造参数中也可以看出,它要求你必须提供一个程序集。而这个文件是不能当作一个程序集打开的。正确的方法是使用
    ResourceReader,具体的代码如下:            string f = Application.ExecutablePath;
                f = f.Substring(0, f.LastIndexOf('\\') + 1);
                ResourceReader rr = new ResourceReader("My.resources");
                var ide = rr.GetEnumerator();
                while (ide.MoveNext())
                {                
                    if (ide.Key.ToString() == "P1")
                        pictureBox1.Image = (Image)ide.Value;
                }   我只写了P1的。
      

  3.   

    对了,那个f是取得路径的。我忘记用了,但是这也证实了当前目录下的资源文件不需要使用绝对路径访问。
    ResourceReader必须取得这个Enumerator进行逐个枚举,没办法直接通过KEY访问。
      

  4.   

    u can use this method.

    public static System.Drawing.Image LoadCurrentModuleResourceImage(string resName)
    {
            StackTrace trace = new StackTrace();
      StackFrame parentFrame = trace.GetFrame(1);
    MethodBase parentMethod = parentFrame.GetMethod();
    Type parentType = parentMethod.DeclaringType;
    Assembly parentAssembly = parentType.Assembly;
    int idx = parentAssembly.FullName.IndexOf(",");
    string assemblyName = parentAssembly.FullName.Substring(0, idx);
    string resPath = assemblyName + "." + resName;
    System.IO.Stream stream = parentAssembly.GetManifestResourceStream(resPath); System.Drawing.Image img = null;
    if (stream!=null)
    {
    img = new System.Drawing.Bitmap(stream);
    }
            return img;
    }
    usage:System.Drawing.Image img = Utilities.LoadCurrentModuleResourceImage("Resources.company.gif");
    visit: 
    http://blog.csdn.net/alonesword/
      

  5.   

    我没明白使用遍历的方法有什么问题?如果你需要经常访问这些资源从而需要考虑效率问题的话你完全可以考虑建立一个这样的对象:Dictionary<string,Object> resources;//在某个地方调用这个函数初始化
    public static Dictionary<string,object> LoadResources(string fileName)
    {
                ResourceReader rr = new ResourceReaderfile(fileName);
                Dictionary<string,object> ret= new Dictionary<string,Object>();            var ide = rr.GetEnumerator();
                while (ide.MoveNext())
                {                
                     ret.Add(ide.Key,ide.Value);              
                }   
                return ret;
    }
    //取得资源只需要如下:
    pictureBox1.Image = (Image)resource["P1"];
      

  6.   

    如果你可以把资源嵌入进程序集的话,你就可以直接使用ResourceManager访问了。
    具体嵌入的方法是在工程是添加资源文件,然后在VS2005中添加你需要编译进来的图片,命名等。然后就会自动编译进程序集了。
      

  7.   

    这个应该就是我想问的问题了,http://www.raingi.com/TestForm.rar这里是我的项目文件,麻烦你帮我看看,谢谢
      

  8.   

    碰上我,你运气不错!看看我这个过来人的源代码:
    http://hi.baidu.com/sageking2/blog/item/29b863ef30ad29e9cf1b3e78.html
      

  9.   

    很简单,照我的方法做:
    1.  按顺序展开你的工程:TestForm-Properties-Resources.resx
    2.  双击Resources.resx,打开资源的编辑界面。然后把你的图片拖到资源编辑器里。修改在资源编辑器中图片的名字,假如我们改为test.
    3.  访问图片代码:Image test= Properties.Resources.test;
      

  10.   

    如果非要ResourceManager,就你的工程要做以下修改:
    1.将你bin\Debug目录下生成的My.resources添加到工程。
    2.修改:
    ResourceManager rm = new ResourceManager("My.resources", Assembly.GetExecutingAssembly());为
    ResourceManager rm = new ResourceManager("TestForm.My", Assembly.GetExecutingAssembly());对于2做点说明,为什么是TestForm.My。首先不要.resources是因为ResourceManager会默认加上这个后缀,你写My.resources,其实它读的是
    My.resources.resources.其次要加上你生成资源的代码所在命名空间,即你ResourceWriter所在命名空间。参照http://www.codeproject.com/KB/cs/cs-multi-assembly-res.aspx上边的例子会有更深刻体会。