如何在WPF C#中使用构建器和存根

时间:2015-06-20 16:28:13

标签: c# wpf builder stub

我尝试使用构建器和存根构建应用程序但是我失败了

我的构建器代码:

File.Copy(AppDomain.CurrentDomain.BaseDirectory + @"\Camstub.exe", filepath);
            string split = "|";
            string info = split + CName.Text + split + Link.Text + split;

            FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
            BinaryWriter bw = new BinaryWriter(fs);
            fs.Position = fs.Length + 1;
            bw.Write(info);
            bw.Close();
            MessageBox.Show(info);

我的存根代码:

public MainWindow()
    {
        InitializeComponent();

        StreamReader sr = new StreamReader(System.Windows.Forms.Application.ExecutablePath);
        BinaryReader br = new BinaryReader(sr.BaseStream);
        byte[] fileData = br.ReadBytes(Convert.ToInt32(sr.BaseStream.Length));
        br.Close();
        sr.Close();

        ASCIIEncoding Enc = new ASCIIEncoding();
        string split = "|";
        string Message = Enc.GetString(fileData);
        MessageBox.Show(Message);

构建器中的消息框显示:

http://embed.gyazo.com/d8f55ce5ea608b3861e64862242b0012.png

应用程序是成功构建的,但是当我执行它时,消息框显示:

enter image description here

所以,我希望两者都有相同的消息框。

有什么想法吗?

提前致谢;)

1 个答案:

答案 0 :(得分:0)

根据评论中提供的信息,您希望从文件末尾读取 | CName | Link | 数据。 | CName | Link | 数据可以是可变长度的。

要处理可变长度数据,您需要以某种方式指示数据的字节长度。在给定的场景中,一个简单而合适的解决方案是在 | CName | Link | 数据之后将字节长度存储为文件末尾的2字节或4字节数字。 2字节数字(即 ushort UInt16 )允许指定最长为65536的长度,并且可能足以满足您的需要。 (如果数据可以超过64KB,则使用4个字节来存储长度。)

因此,构建者应该执行以下操作:

  1. 撰写 | CName | Link | 字符串数据并将其存储在 info 变量中。
  2. info 中的字符串转换为具有所选文本编码的字节数组。 (我建议使用UTF-8文本编码。)
  3. 将此字节数组附加到可执行文件。
  4. 将字节数组的长度作为2字节数附加到可执行文件的末尾。

  5. 存根应该做这样的事情:

    1. 确定可执行文件的文件大小。
    2. 打开可执行文件进行阅读。
    3. 将当前文件位置设置为fileSize-2,因此可以读取 | CName | Link | 的长度。
    4. 读取2字节数字并将其存储到 ushort (或 int )变量 dataLength
    5. 将当前文件位置设置为fileSize-2-dataLength。
    6. 读取 | CName | Link | 数据的字节。要读取的字节数由 dataLength 指定。
    7. 处理 | CName | Link | 数据字节。例如,使用构建器使用的相同()文本编码将它们转换为字符串。