2015-05-24 109 views
-1

我正在編寫一個安裝程序。這個安裝程序應該能夠在.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方法?

回答

0

下面是我已經解決了這個問題:

我已經把目標CPU「任何CPU」而這個問題已經完全消失。通過這種TailFiles方式,我現在可以將無限數量的自定義數據添加到文件的尾部。對於現在的反病毒軟件卡巴斯基並沒有說任何壞東西,這不是太優雅,非常有效的方式來存儲其他文件尾巴。

相關問題