2012-07-01 115 views
0

因此,我爲我的一個項目製作了一個定製的安裝程序,我需要的是將所有內容「打包」到一個文件中。 (我不能使用ILMerge或.NETZ,因爲我必須包括的其中一件事是非託管的(就是它被稱爲?)程序集。) 無論如何,我主要從這裏讀了很多東西,而人們說要這樣做:在閱讀嵌入式組件(.dll)時遇到的問題

  • 將.dll作爲嵌入式資源添加;
  • 向AssemblyResolve方法添加一個處理程序,以便在我的應用程序找不到程序集時觸發
  • 在該處理程序中,使用將函數傳輸到字節數組的函數從內存中加載.dll Assembly.Load()可以使用它。

我做了所有的東西,我添加了一個正常的參考.dll,所以我的代碼可以正確編譯。但是,當我從應用程序所在的目錄中刪除.dll文件並嘗試運行它時,「無法加載文件或程序集...」對話框(或其它任何東西,你知道我在說什麼)彈出並告訴我它無法加載我的.dll,儘管我明確告訴它從AssemblyResolve EventHandler中的該字節數組中加載它。
對不起,如果這是之前已經回答的東西。看看推薦的類似問題,但我看不到這個答案。
我唯一能看到的可能是「C#不允許我從字節加載,除非我處於高度安全的環境中」。如果有人知道任何事情,你能否確認/否認這個聲明,並告訴我什麼是「高度安全的環境」?我承認,我是一個複雜東西的十月。 :)

在此先感謝您的時間和答案!

回答

1

程序集是託管dll的另一個名稱 - 本地dll的最終不會出現在AssemblyResolve位afaik中。我不知道是否有任何其他選項,但在啓動時將嵌入式dll保存到磁盤,但我沒有找到一個選項告訴操作系統(負責加載非託管dll)如何找到嵌入式dll。

+0

「native」dll等於「managed」dll,是這樣嗎?哦,這裏的用戶說過關於安全上下文的事情也表示,如果程序集流式傳輸到磁盤上,然後使用'Assembly.Load(filename);'從那裏加載,那麼它就不會有問題。我會給這個方法一個鏡頭,我們會看到...... – Lumos

+0

「託管」,在這種情況下,「組裝」是.NET的dll的。 「非託管」和「本地」是非.NET dll的。術語「本地」意味着dll不能用於不同的平臺,而.NET dll不是平臺特有的。 –

+0

@ C.Evenhuis dll的位置應該位於Environment PATH變量或應用程序運行位置。尋找操作系統嘗試搜索dll的位置的最佳方法是使用sysinternal的ProcMon(http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx),通過監視應用程序的文件讀/寫活動處理。 –