C# 如何在WPF C中使用生成器和存根#

C# 如何在WPF C中使用生成器和存根#,c#,wpf,builder,stub,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 F

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

我的生成器代码:

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);
生成器中的消息框显示:

应用程序已成功构建,但执行时messagebox会显示:

因此,我希望这两种语言中的messagebox是相同的

有什么想法吗


提前感谢;)

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

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

因此,建筑商应执行以下操作:

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

  • 存根应该执行如下操作:

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

  • 存根从可执行文件中读取前xxx字节(xxx等于文件长度),并将其放入信息中(注意,Windows可执行文件或DLL文件总是以魔法字节“MZ”开头)。在您的构建器中,变量信息由不同的数据(CName和Link)组成,因此您看到存根和构建器消息框之间的差异也就不足为奇了。没有理由期望两个MessageBox显示相同的数据……您是否打算读取附加在文件末尾的Cname/Link数据?如果是,这是恒定长度的Cname/链路数据,即恒定字节数;或者它的长度可以是可变的?是的,嗯,所以我必须在文件的末尾阅读,但是CName/链接的长度可以是可变的。谢谢你的帮助,我很确定你的解决方案是好的,但是我找到了另一个,我在“|CName | Link |”之前添加了一个字符串,比如“-START-”,然后我读取了所有流,并在“-START-”之后保留信息存根程序需要读取整个文件才能找到“-start-”标记。一种非常低效的做事方式。。。在我的方法中,只读取2+个dataLength字节。但是,我不知道您的应用场景。也许性能是无关紧要的,而您的方法正适合您的目的…:-)但是请考虑一下:如果可执行文件在其文件数据中已经包含“-START”,那该怎么办?那么你的方法失败了,而我的方法仍然可以正常工作。。。提示:这会发生,因为“-START-”字符串文字将是已编译C#代码的一部分,因此已经是已编译可执行文件的一部分P