2010-07-19 52 views
2

我正在使用Visual Studio 2008在Windows 7 64位中開發。我有一個使用ILMerge合併到單個DLL中的類庫集合。當我嘗試使用此合併DLL,但是,我得到BadImageFormatException和.NET在Windows 7中ILMerged DLL 64

[BadImageFormatException:未能加載文件或程序集「MyMergedDll」或它的一個依賴。試圖加載程序格式不正確。]

我一直在尋找周圍幫助,這和它看起來像我需要設置生成屬性在每個項目中MyMergedDll目標86,所以我做到了。我還在Web服務中設置了所有非MSTest項目,其中我將MyMergedDll引用爲x86目標。但是,我仍然收到這個錯誤。

如果this blog entry是可以相信的,我能得到這個錯誤因爲這樣做的結果是:

public class SpecificClass: BaseClass: where T : class { } 

也就是說,具有一個通用類約束。雖然這篇博客是從2007年開始的,但我不知道這是否仍然適用。我希望從StackOverflow獲得一些輸入,以瞭解你們認爲問題出在我追蹤我的項目中的每個泛型類以檢查約束之前。

重要的是,MyMergedDll是強名字簽名的。我試圖在控制檯應用程序和Web服務中使用MyMergedDll。我不知道是否每次重建Web服務時IIS是否更新都可能使事情變得複雜。使用控制檯應用程序時,我似乎在構建發行模式時獲得BadImageFormatException

+0

您能否澄清一些觀點: 1.運行ILMerge時或執行應用程序時是否出現錯誤? – 2010-07-19 16:36:12

+0

單個項目DLL與ILMerge很好地融合在一起。控制檯應用程序和使用合併DLL的Web服務可以正常工作。當我或者a)運行我的控制檯應用程序或b)訪問運行Web服務的Web服務器上的.asmx文件時,出現錯誤。 – 2010-07-19 16:44:49

回答

2

我得到它的工作,我認爲它是從做兩件事情:

  1. MyMergedDLL用一對夫婦的其他組件我有控制權而建,但這些組件中,沒有設置目標86。我重建了那些針對x86的程序集,重新構建了組成MyMergedDLL的程序集,並重新合併了這些程序集以形成MyMergedDLL的新副本。
  2. 使用MyMergedDLL的控制檯應用程序被設置爲以調試模式而不是發佈模式爲目標x86,因此爲什麼它可以在調試模式下工作,但在發佈模式下使用BadImageFormatException

第一件事可能沒有必要。我想我只需要MyMergedDLL的使用者也可以在發佈模式下使用x86。我永遠無法弄清楚我正在使用哪個版本的ILMerge,所以我只是重新安裝了我可以在微軟網站上找到的最新微星。

0

您是否仔細檢查了您正在使用的ILMerge的版本?

我問,因爲一箇舊的,不正確的版本的aspnet_merge(基本上做了相同的dll合併其他事情)導致我們有同樣的問題,你正在描述。當我回答this問題時,我進入了一些細節。

這可能是值得快速查看ILDASM中的dll(試圖反編譯這些壞dll時反射器傾向於 - 也許不明顯),並看看你是否可以弄清楚腐敗點和相應的在您的代碼中,因爲它可能會解決問題。

+0

如何檢查ILMerge版本?我試過'-v','-V','--version','-h',但沒有運氣。 C:\ Program Files(x86)\ Microsoft \ ILMerge中的唯一文檔是ILMerge License.rtf和ILMerge.doc,它們都不包含版本。他們看起來在2009年被修改過了。我將在我的合併DLL上嘗試ILDASM,謝謝。 – 2010-07-19 16:53:39

+0

這是我第一次使用ILDASM。它是否應該在某處窒息並顯示一些錯誤消息?我沒有看到任何錯誤,當我打開我的合併DLL,只是命名空間層次結構。 – 2010-07-19 16:55:26

+0

@Sarah - 它不會自己窒息,但它生成的IL有錯誤,例如[SIGNATURE ENDED PREMATURELY]和IIRC有關「找不到類型」的錯誤。這些錯誤的存在讓我們能夠確定它遇到的問題是哪一部分代碼。事實證明,在我們的例子中,這是lambda表達式的問題,它最終導致我們朝向.Net 3.5版本的ILMerge。絕對值得確保你使用最新的ILMerge我會說,只是爲了確保。 – 2010-07-19 18:58:58