C# 将文件嵌入现有.Net可执行文件

C# 将文件嵌入现有.Net可执行文件,c#,resources,installation,embedding,C#,Resources,Installation,Embedding,我正在写一个安装程序。此安装程序应该能够在.exe正文中嵌入1..n个文件。我不想发送两个单独的文件(如.exe和.cab) 首先,我尝试了mono.cecil variant来添加新的外部资源(每个文件都是单个资源),但我已经达到了它的极限,因为它在内部使用byte[]读取文件并分析它,然后修改缓冲区并写入。我得到大于500MB的文件导致内存溢出。我也尝试过调试Mono.Cecil,但没有成功。字节[]和MemoryStream用于内部及其庞大复杂的库,以尝试进行更改 第二:我的想法是简单地将

我正在写一个安装程序。此安装程序应该能够在.exe正文中嵌入1..n个文件。我不想发送两个单独的文件(如.exe和.cab)

首先,我尝试了mono.cecil variant来添加新的外部资源(每个文件都是单个资源),但我已经达到了它的极限,因为它在内部使用byte[]读取文件并分析它,然后修改缓冲区并写入。我得到大于500MB的文件导致内存溢出。我也尝试过调试Mono.Cecil,但没有成功。字节[]和MemoryStream用于内部及其庞大复杂的库,以尝试进行更改

第二:我的想法是简单地将文件添加到.exe的尾部,然后从那里读取它们。我正在为此使用一个类:

        // signature is being used to identify the metainformation
        var Tail = new msTailFiles(msTailFiles.RandomSignature(), FN);

        // Add to tail
        foreach (var F in Directory.EnumerateFiles(@"c:\Windows"))
            Tail.AddFile(Path.GetFileName(F), F);

        // Read file info
        var AllFiles = Tail.GetFileNames();

        // Take files from tail and put to filesystem
        foreach (var F in Tail.GetFileNames())
        {
            Tail.GetFile(F, File.Open(@"f:\copy\" + F, FileMode.Create));
        }
使用此方法,我可以将现有的.exe文件扩展到文件系统文件大小限制,这很好

但是如果超过1.5GB大小限制,我会遇到问题,我可以在explorer中成功读取.exe文件信息,因此我不会破坏.exe结构,但如果启动此文件,我会从explorer中得到错误:“此应用程序无法启动。”。另外,获取错误信息大约需要30秒,看起来windows正试图将整个2GB加载到内存或以某种方式进行分析(也许IL会这样做?)。所有元信息,如版权、大小、类型、所有者、.exe图标仍会显示,因此看起来都不错,但我的样式有问题


所以我的问题是:我的问题是什么?除了使用TailFiles()方法或Mono.Cecil方法之外,还有人有其他建议吗?

以下是我解决这个问题的方法:

我已经将目标CPU设置为“任意CPU”,这个问题已经完全消失。通过这种TailFiles方式,我现在可以在文件尾部添加无限数量的自定义数据。目前,反病毒软件卡巴斯基并没有说任何不好的事情,因为它不是一种非常优雅、非常有效的方式,可以在尾部存储其他文件