2010-07-06 163 views
4

這是我ERRORMESSAGE:無法加載文件或程序集

無法加載文件或程序集 '文件:/// C:\ WINDOWS \ SYSTEM32 \ Rule.dll'。 系統找不到指定的文件。

問題是相同的exe在我的開發環境中工作,但不在生產性服務器上。該程序是一個應該在Windows Server 2008上作爲計劃任務運行的工具。它包含一個exe文件,一個名爲Database.dll和Rule.dll的文件。 exe應該在代碼隱藏中動態加載Rule.dll,但只有從Task Scheduler啓動時纔會出現上述錯誤。爲什麼它看起來在System32文件夾中,而不是在應用程序文件夾中?這是一個UAC問題嗎?

'Load the rule engine into memory 
Dim asmRule As System.Reflection.Assembly = Nothing 
Try 
    asmRule = System.Reflection.Assembly.LoadFrom("Rule.dll") 'fails on productive system 
Catch ex As System.Exception 
    HistoryLog.writeLog("SysLog", ex, "Cannot find Rule.dll in Application Folder") 
End Try 
+1

奇數。看看fuslogvw.exe是否能告訴你一些東西。 – 2010-07-06 14:40:01

回答

7

你試過:

asmRule = Assembly.LoadFrom(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Rule.dll")); 
+1

我會試試看,謝謝 – 2010-07-06 14:42:09

1

設置爲「啓動」的文件夾中的exe任務(在Windows 7,這是在其上配置應用程序的路徑要運行的屬性頁上) - 這種方式在當前文件夾(來自環境)在應用程序運行時與應用程序文件夾相同。 .Net應該在解析非根路徑時使用該文件夾。

我相信你所看到的是一個常見問題,你也可以通過快捷方式獲得。

那就是 - 啓動文件夾被設置爲一樣的任務調度的根源 - 其啓動DLL是在C:\ Windows \ System32下

這就是它的工作原理在我的機器上的事實(TM )'大概是因爲當你在本地調試時,你直接運行它?

其他的答案在這裏,建議使用BaseDirectory也將工作。

同樣,您也可以將代碼更改爲使用完整程序集名稱,並簡單地使用Assembly.Load。但是,如果該DLL的version/culture/publickeytoken將來發生更改,則會中斷此操作。當然,這可以通過使用.config文件來提供要加載的DLL的名稱,而不是對其進行硬編碼來緩解。無論如何,這是很好的做法。

+0

感謝您的詳細解釋 – 2010-07-06 14:49:47

7

方法LoadFrom將使用Environment.CurrentDirectory來構建將被加載的程序集的完整路徑。當前目錄與應用程序基本路徑不同。

您應該提供LoadFrom方法的完整路徑,如果該文件位於相同的文件夾中,則可以使用AppDomain.CurrentDomain.BaseDirectory來構建該文件,然後使用可執行文件。

+0

是的,這是解決方案,謝謝 – 2010-07-06 14:52:16

2

檢查生產服務器的system32文件夾下一個名爲Rule.dll文件。從「應用程序」文件夾嘗試加載之前,可能發生「探測」或嘗試從系統文件夾加載程序集。

這是LoadFrom在MSDN上市缺點:

如果一個組件被加載有 LoadFrom,和探測路徑 包括具有相同 身份,但不同的位置的組件,一個 InvalidCastException的, MissingMethodException或其他 可能會出現意外的行爲。

如果是這種情況,並且無法從system32中刪除Rule.dll,那麼您可以指定程序集的完整路徑。

+0

感謝有關缺點的解釋,我會牢記在心 – 2010-07-06 14:50:59

相關問題