我正在尝试构建一个简单的程序,我想找到一种方法在可执行文件中嵌入一个文件(或多个文件)。
该程序非常简单。我将在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)交给朋友,这样他就没有任何来源,我无法保证这条路径。
答案 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
提供的链接逐步提供了如何完成此任务:
将图像添加为资源后,说明将显示如何访问图像资源并在程序中使用它。只需点击上面的链接,然后按照说明操作即可。
我按照上面的说明编写了我的程序:
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;
}
}
}
我的输出如下:
表单上的图像来自我作为资源嵌入的图像。很容易做到。
答案 2 :(得分:0)
将文件添加到项目中,然后将其Build Action设置为嵌入式资源。从代码中可以执行以下操作:
var _assembly = Assembly.GetExecutingAssembly();
var _stream = _assembly.GetManifestResourceStream("namespace.fileneme");