将文件嵌入可执行文件中

时间:2014-02-12 18:19:47

标签: c# forms file embedded-resource

我正在尝试构建一个简单的程序,我想找到一种方法在可执行文件中嵌入一个文件(或多个文件)。

该程序非常简单。我将在visual studio中使用C#构建一个表单。在表单上,​​会有几个问题和一个提交按钮。

一旦用户回答完所有问题并点击提交按钮,如果所有答案都正确,我想将该文件作为奖品提供给用户。 (该文件可以是图像,视频或包含多个其他文件的zip文件)

我想给用户提供文件的方式非常灵活。它可以在与可执行文件相同的目录中创建此文件,或者为用户提供下载选项以将其保存在其他位置。

以下是伪代码

private void submit_Click(object sender, EventArgs e)
{
    //functions to check all answers
    if(all answers are correct)
    {
        label.Text = "Congrats! You answered all questions correctly";

        //create the file that was embeded into the same directory as the executable
        //let's call the file 'prize.img' 

        Process.Start("prize.img");
    }
    else
        label.Text = "Some answers were not correct";
}

逻辑非常简单直接。问题是,如何将“prize.img”嵌入到可执行文件中?我将把这个程序(.exe)交给朋友,这样他就没有任何来源,我无法保证这条路径。

3 个答案:

答案 0 :(得分:2)

您希望将文件作为资源嵌入。

右键单击项目文件,选择“属性”。

在打开的窗口中,转到“资源”选项卡,如果标签页中间只有一个蓝色链接,请单击它以创建新资源。

在您的代码中,您可以输入Resources.TheNameYouGaveTheFileHere,您可以访问其内容。请注意,第一次在类中使用Resources类时,需要添加using指令(在按下Ctrl +。键入资源后获取菜单以让VS为您执行此操作)。

您是否还需要有关保存文件的帮助?

编辑:

你可以这样做:

var resource = Properties.Resources.yourResource;

FileStream fileStream = new FileStream("filename.exe", FileMode.CreateNew);
for (int i = 0; i < resource.Length; i++)
    fileStream.WriteByte((byte)resource[i]);
fileStream.Close();

对你有帮助吗?

编辑:

我可以看到你正在获得一个流,这里有一个更新,使它工作:

var resource = Properties.Resources.yourResource;

FileStream fileStream = new FileStream("filename.exe", FileMode.CreateNew);
resource.CopyTo(fileStream);
fileStream.Close();

现在有用吗?

答案 1 :(得分:1)

您无法在解决方案中将图像文件添加为资源吗?然后你可以在代码中引用该资源吗?

看看这可能是您正在寻找的: Embedding Image Resource in Project

提供的链接逐步提供了如何完成此任务: enter image description here

将图像添加为资源后,说明将显示如何访问图像资源并在程序中使用它。只需点击上面的链接,然后按照说明操作即可。

我按照上面的说明编写了我的程序:

using System.Drawing;
using System.Windows.Forms;
using System.Reflection;

    namespace WindowsFormsApplication6
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                var myAssembly = Assembly.GetExecutingAssembly();
                var myStream = myAssembly.GetManifestResourceStream("WindowsFormsApplication6.Desert.jpg");
                var image = new Bitmap(myStream);

                pictureBox1.Image = image;
            }
        }
    }

我的输出如下:

enter image description here

表单上的图像来自我作为资源嵌入的图像。很容易做到。

答案 2 :(得分:0)

将文件添加到项目中,然后将其Build Action设置为嵌入式资源。从代码中可以执行以下操作:

var _assembly = Assembly.GetExecutingAssembly();
var _stream = _assembly.GetManifestResourceStream("namespace.fileneme");