2011-03-17 50 views
6

我想用戶從我的網站下載一個exe文件,在這裏(同步下載)一個XML文件被注入到這個應用程序中。這個XML文件包含一個公鑰和一個簽名。如何在運行時將文件注入EXE並在程序運行期間引用該文件?

如何在下載前注入文件並在執行過程中稍後參考它?

理想情況下,我不會使用shell來注入文件,而是使用本機.NET API。

+0

哎,可能你要麼要求更多的信息,或接受一個答案? – 2011-03-19 09:32:00

+0

@JB - 對不起,忙於編碼和單元測試! – LamonteCristo 2011-03-19 14:27:47

回答

8

你可以,可以輕鬆地與Mono.Cecil,你只需要編寫類似:

var module = ModuleDefinition.ReadModule ("Application.exe"); 

module.Resources.Add (
    new EmbeddedResource (
     "signature.xml", 
     ManifestResourceAttributes.Private, 
     File.ReadAllBytes ("signature.xml"))); 

module.Write ("Application.exe", 
    new WriterParameters { 
     StrongNameKeyPair = new StrongNameKeyPair ("keypair.snk") 
}); 

以將來自signature.xml中文件signature.xml中的資源,然後再次登錄你的組件,你的密鑰對.snk,您用來簽署Application.exe。

並在運行時,你只需要使用:

var stream = Assembly.GetExecutingAssembly() 
    .GetManifestResourceStream ("signature.xml"); 

來檢索資源。

1

注入文件將其添加到您的項目。然後在解決方案資源管理器中右鍵單擊它,轉到屬性,並將其類型更改爲EmbeddedResource。

要在運行時加載它,請使用Assembly.GetManifestResourceStream()。在這裏閱讀更多:http://msdn.microsoft.com/en-us/library/xc4235zt.aspx

+0

我認爲他的意思是修改編譯後的二進制程序集中的資源。 – 2011-03-17 14:54:35

+1

是的,他可能會要求在編譯事實之後嵌入文件。 – Kumar 2011-03-17 14:57:27

+1

那麼,我回答了一半的問題 - 如何訪問它:) – Alex 2011-03-17 14:59:46

1

從他寫的看來,他會在下載之前動態更改文件。 這實際上取決於您使用的服務器端語言,以及您對服務器/託管提供商帳戶的多少控制。
假設你有一個download.aspx文件,它生成這個exe文件併發送下載。 你可以做的一件事是將程序集的源代碼放到你的服務器上,然後download.aspx將它彙編併發送下載。 (困難的方法)
另一種方法是將編譯後的程序集放在服務器上,然後使用例如塞西爾(Programmically embed resources in a .NET assembly)或其他方式來更改它然後發送它下載。

0

將文件添加到您的項目,一般的東西沿着線:

+solution 
    +project 
    +Resources 
     +SomeDirectory 
     -SomeFile 

然後轉到您的項目的屬性,進入資源標籤左側的網站,並選擇在頂部導航欄的files資源酒吧。選擇添加資源>添加現有文件。瀏覽到剛剛放入項目的文件,然後選擇添加它。

該文件現在顯示在您的項目屬性的資源選項卡下。在「資源」選項卡中更改文件的名稱,使其更有意義。

的文件現在你的項目嵌入的資源,你可以通過以下代碼訪問它:

var MyFile = Properties.Resources.MyFile 
+0

重新閱讀OP的問題後,這不是正確的答案。標題是詢問如何將文件嵌入到exe文件中,但問題是如何將文件注入到exe文件中。我編輯了問題的標題以反映實際問題。如果你願意,隨時刪除我的答案。 – 2011-03-17 15:07:58