【问题标题】:How to retrieve a JPG image using GetManifestResourceStream() method?如何使用 GetManifestResourceStream() 方法检索 JPG 图像?
【发布时间】:2014-05-25 12:14:09
【问题描述】:

我有以下情况:

我有一个名为MySolutionSolution,在这个解决方案中有一些项目,包括一个名为PdfReport的项目。在这个项目里面有一个名为Shared文件夹,在这个文件夹里面有一个header.jpg图片。

现在我正在尝试检索此文件,并且在官方文档 (http://msdn.microsoft.com/en-us/library/aa287676%28v=vs.71%29.aspx) 上找到了此代码:

System.Reflection.Assembly thisExe;
thisExe = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream file = 
    thisExe.GetManifestResourceStream("AssemblyName.ImageFile.jpg");
this.pictureBox1.Image = Image.FromStream(file);

在文档上说:

将“AssemblyName.ImageFile.jpg”替换为资源的名称,如 它在程序集中是已知的。

我很难理解在特定情况下必须插入的内容作为 GetManifestResourceStream() 方法的输入参数。

你能帮我找回我的文件吗?

Tnx

【问题讨论】:

标签: c# asp.net .net


【解决方案1】:

//第一步 1.您在项目中添加了一个成像仪。 2. 右键单击​​图像并将 Build Action 更改为 Embedded Resource。 Right click on the image and change Build Action to Embedded Resource.

在您的代码中: 取消注释下面的行并添加一个断点。它将返回一个列出所有资源的数组。只需找到您的资源,然后将“assembly.draft.png”替换为您的资源即可。

//  var d = thisExe.GetManifestResourceNames();
System.IO.Stream file =
 thisExe.GetManifestResourceStream(@"assembly.draft.png");
while ((read = file.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}

【讨论】:

  • 您需要显示“ms”实例化的类。你需要定义缓冲区。我假设缓冲区是 byte[]
【解决方案2】:

GetManifestResourceStream 采用资源在程序集中存储的名称。编译器选择该名称。据我所知,这个名称是由程序集名称、命名空间名称和文件名拼凑而成的。

老实说,我通常会在 Reflector 或任何其他 .NET 反汇编程序中打开已编译的程序集,然后从那里复制资源名称。我承认这是一种原始技术,并非基于对技术的理解,但它可能对您有好处。

【讨论】:

    【解决方案3】:

    如果是嵌入式资源,可以使用名称MySolution.Properties.Resources.ImageFile.jpg获取,否则使用如下语句

    this.pictureBox1.Image = Image.FromFile(Application.StartupPath + @"\shared\ImageFile.jpg");
    

    【讨论】:

      【解决方案4】:

      使用方法 String[] fileNames = assembly.GetManifestResourceNames(); 它将返回所有文件,包括命名空间,只取以你的名字结尾的文件:

          public static Stream ExtractResourceFile(Assembly assembly, String fileName )
          {
              // get all embedded resource file names including namespace
              String[] fileNames = assembly.GetManifestResourceNames();
      
              String resourceName = null;
              String temp = "." + fileName.ToUpper();
              foreach (var item in fileNames)
                  if (item.ToUpper().EndsWith(temp))
                      resourceName = item;
              if (resourceName == null)
                  throw new Exception("Embedded resource [" + fileName + "] not found");
              Tracer.Debug("Resource file name [{0}] found as [{1}]", fileName, resourceName);
      
              // get stream
              Stream stream = assembly.GetManifestResourceStream(resourceName);
                  if (stream == null)
                      throw new Exception("Embedded resource [" + resourceName + "] could not be opened.");
              return stream;
          }
      

      【讨论】:

        猜你喜欢
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2017-06-26
        • 2015-07-02
        • 1970-01-01
        • 1970-01-01
        • 2015-06-13
        相关资源
        最近更新 更多