如何使用GetManifestResourceStream()方法检索JPG图像?

3
我有以下情况:
我有一个名为MySolution的解决方案,其中包含一些项目,包括一个名为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()方法中插入什么作为输入参数。

你能帮助我检索我的文件吗?

谢谢


请查看此处:https://dev59.com/nHM_5IYBdhLWcg3w3nRs - TaW
4个回答

2

//第一步 1. 将图像添加到项目中。 2. 右键单击图像,将“生成操作”更改为嵌入式资源。 右键单击图像,将“生成操作”更改为嵌入式资源。

在您的代码中: 取消下面的行的注释并添加断点。它将返回一个包含所有资源列表的数组。只需找到您的资源,并将“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[]。 - Golden Lion

0
使用方法 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;
    }

0

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

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

0

GetManifestResourceStream 接受程序集中存储资源的名称。编译器会选择该名称。据我所记,该名称由程序集名称、命名空间名称和文件名称组合而成。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接