我正在編寫一個安裝程序。這個安裝程序應該能夠在.exe主體中嵌入1..n個文件。我不想運送2個獨立的文件(如.exe和.cab)。將文件嵌入到現有的.Net可執行文件中
首先,我嘗試了mono.cecil變體來添加新的外部資源(每個文件是單一資源),但我已經達到了極限,因爲它在內部使用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 sizelimit,我可以在瀏覽器中成功讀取.exe文件信息,所以我不打破.exe結構,但是如果我啓動這個文件,我得到錯誤:「This applicaton無法啓動。「從探險家。還需要大約30秒才能得到錯誤信息,它看起來像Windows正試圖加載整個2GB到內存或分析莫名其妙(也許IL呢?)。所有Metainformation,如版權,大小,類型,所有者,圖標的.exe仍然顯示,所以一切看起來不錯,但有一些麻煩,我的風格。
所以我的問題是:什麼可能是我的問題?有沒有人有任何其他建議,而不是使用TailFiles()方法或Mono.Cecil方法?