【问题标题】:Embed File in a Executable在可执行文件中嵌入文件
【发布时间】:2014-03-11 06:34:46
【问题描述】:

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

程序非常简单。我将在 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)给一个朋友,这样他就没有任何来源,我也不能保证路径。

【问题讨论】:

    标签: c# forms file embedded-resource


    【解决方案1】:

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

    右击项目文件,选择属性。

    在打开的窗口中,进入资源标签,如果标签页中间只有一个蓝色链接,点击它,创建一个新资源。

    您可以在代码中输入 Resources.TheNameYouGaveTheFileHere 并访问其内容。请注意,第一次在类中使用 Resources 类时,需要添加 using 指令(在输入 Resources 后按 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();
    

    现在可以用了吗?

    【讨论】:

    • 是的,请。你能提供一些示例代码吗?我并没有真正关注你提到的使用 Resources 类的地方。
    • @sora0419 Korhner 可能指的是 System.Reflection 和 System.IO 指令。
    • @korhner 抱歉回复晚了。我在“fileStream.WriteByte((byte)resource[i]);”这一行收到错误,错误消息显示“无法使用 [] 将索引应用于 'System.IO.UnmanagedMemoryStream' 类型的表达式”
    • @korhner 我可以稍微修改一下写入功能,并且不仅可以使用 img 文件,还可以使用音频文件。非常感谢!
    【解决方案2】:

    您不能将图像文件作为资源添加到您的解决方案中吗?然后您可以在代码中引用该资源?

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

    提供的链接提供了如何完成此操作的分步说明:

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

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

    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;
                }
            }
        }
    

    我的输出如下所示:

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

    【讨论】:

      【解决方案3】:

      将文件添加到项目中,然后将其构建操作设置为嵌入资源。

      从您的代码中,您可以执行以下操作:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        • 2011-11-09
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多