1,現象
我做了一個windows服務,為了以后部署方便,將其中容易發生變動的流程,做成了一個DLL插件A,然后在windows服務啟動的時候啟動加載。編程環境是在Windows2003服務器系統上,然后部署的系統是Windows 2008 R2。我的服務啟動5秒鍾后就自動停止了,並且try...catch不到任何異常。
2,資料,以下來自微軟技術資源庫 http://technet.microsoft.com/zh-cn/library/k7137bfe
關於異常的疑難解答:System.BadImageFormatException
,當 DLL 或可執行程序的文件映像無效時, BadImageFormatException 引發異常。
-
如果您的應用程序使用了 32 位組件,請確保該應用程序始終采用 32 位應用程序的運行方式。
-
如果應用程序項目的“平台目標”屬性設置為 AnyCPU,則編譯后的應用程序在 64 位或 32 位模式中均可運行。 如果采用 64 位應用程序運行方式,則實時 (JIT) 編譯器便會生成 64 位本機代碼。 如果應用程序依賴於某個 32 位托管組件或非托管組件,則在 64 位模式中無法加載該組件。 若要糾正此問題,請將項目的“平台目標”屬性設置為 x86,然后重新編譯。
-
確保未使用利用其他 .NET Framework 版本創建的組件。
-
如果使用 .NET Framework 1.0 或 .NET Framework 1.1 開發的應用程序或組件嘗試加載使用 .NET Framework 2.0 SP1 或更高版本開發的程序集,或者使用 .NET Framework 2.0 SP1 或 .NET Framework 3.5 開發的應用程序嘗試加載使用 .NET Framework 4 開發的程序集,便會引發此異常。BadImageFormatException 異常可能會報告作為編譯時錯誤,或在運行時可能會引發該異常。 有關示例,請參見 BadImageFormatException 類。
-
確保文件映像是有效的托管程序集或模塊。
-
當非托管動態鏈接庫或可執行文件傳遞給 Load 方法進行加載時會引發此異常。
有關更多信息,Visual Basic 用戶可以參見互操作性疑難解答 (Visual Basic)。
3,解答
由於插件A應用程序項目的“目標平台”屬性設置為 AnyCPU,在x64位模式中無法加載該組件,所以我將插件A應用程序項目的“目標平台”設置為“x86”,然后停止服務,將重新生成的插件A放到服務安裝目錄下,重新啟動程序,OK!
這里改正一下,剛才我在上面寫的是X64,日志里記錄“試圖加載格式不正確的程序”!