2010-03-23 105 views
1

我有一個.NET COM程序集,我試圖部署到Web服務器(IIS 6 Win 2003)。我們已經成功地將此程序集部署到了我們的測試環境,但生產環境無法正常工作。部署.NET COM DLL,出現錯誤(0x80070002)

從傳統的ASP頁面調用程序集。每當頁面嘗試用「Set LTMRender = CreateObject("LTMRender.Render")」初始化程序集時,都會收到錯誤「Error Type:, (0x80070002)」。

此錯誤似乎表明權限被拒絕,或文件未找到類型問題。

我創建了一個測試應用程序,以查看程序集是否在網頁之外工作。 .exe初始化程序集,然後進行設計爲失敗的調用,從而導致程序集生成日誌文件。如果我在與程序集相同的文件夾中運行.exe,但是如果我在別處運行它,則會失敗。

出於某種原因,程序集不能從外部文件夾訪問。

我不明白爲什麼這不起作用。我已經確認的事情:

  • 部署文件夾具有足夠的權限。
  • 我們已確認安裝的程序集文件夾具有所有必要用戶帳戶的正確權限。
  • 程序集使用強名稱進行簽名,並使用regasm.exe C:_WebSites \ LTMRender \ LTMRender.dll/codebase /tlb:C:_WebSites\LTMRender\LTMRender.tlb進行了註冊。 Regasm報告成功。
  • 程序集具有正確的屬性和相關的GUID集。

任何提示?

編輯

我們跑的Filemon對我testapp.exe,它似乎已經表明問題是什麼。當testapp.exe在D:_websites \ DocWebV2 \或D:_websites \ DocWebV2 \ LTMRender \文件夾中運行時,它會成功並且filemon顯示爲D:_websites \ DocWebV2 \ LTMRender \ pinPDF.dll SUCCESS

如果我運行testapp .exe在D:_websites \ DocWebV2 \客戶端 - 我的asp頁面運行,它顯示D:_websites \ DocWebV2 \ pinPDF.dll名稱未找到,然後D:_websites \ DocWebV2 \ pinPDF \ pinPDF.dll文件未找到

我不知道爲什麼它不在正確的文件夾中,如果它只在這個特定的文件夾下。

+0

您的分析聽起來目前爲止 - 看起來像是文件系統權限問題。我建議你使用procmon或filemon(免費sysinternals工具)來跟蹤權限的問題。從外部目錄運行測試應用程序。您將能夠清楚地看到文件系統權限失敗。 – Cheeso 2010-03-23 15:11:02

回答

1

如果是文件未找到,不是權限問題。 7表示Windows錯誤,2表示ERROR_FILE_NOT_FOUND。 COM可見組件的常見問題是Windows或CLR無法找到依賴的DLL。但是這應該會生成一個不同的錯誤代碼。在源代碼中查找問題,嘗試打開文件而不使用文件的完整路徑名。工作目錄在您的服務器上會有所不同。解決此問題的最佳方法是使用調試器。

+0

我無法在生產中運行調試器。我相信,這對於試圖編寫文件或者類似文件的.dll來說並不是問題。 我的編輯概述了我的最新信息。似乎.dll(根據Filemon)正在加載,但它使用的依賴關係不是。它正在從我運行testapp.exe的文件夾中尋找依賴項,而不是我的.dll所在的文件夾,這是它們的位置。 – Bremer 2010-03-23 19:37:14

+0

好吧,就像我剛纔提到的那樣,這是設計。您可以通過在GAC中存儲程序集或在PATH目錄中的非託管DLL中解決此問題。 – 2010-03-23 19:56:00

1

發現此問題。不完全確定我理解它,但我確實有它的工作。特別感謝nobugz讓我專注於路徑。

Filemon顯示在我們的測試環境中找不到產品的依賴(託管.NET).dll。

的關鍵是在生產我們的網絡團隊選擇部署到不同的文件夾,然後進行測試,所以我們有:

PROD
d:_Websites \ DocWebV2 \ LTMRender
TEST
D:_Websites \ LTMRender

當我更改TEST以使用與PROD相同的文件夾結構時,問題是可重現的。

我的程序集,作爲一個COM .dll被找到,因爲它已被註冊。依賴.dll沒有註冊,所以windows正在執行整個檢查GAC,然後是PATH文件夾,然後是正在執行的進程文件夾,但沒有找到它。

我總是假定「正在執行的進程文件夾」將是.dll文件夾(因爲它調用依賴.dll),但看起來網頁是正在執行的進程。

現在我不明白的是爲什麼D:_Websites \ LTMRender被檢查。這不在我們的PATH中。我假設IIS正在做這件事,因爲d:_WebSites是那裏所有Web設置的根文件夾。我不是IIS的專家,所以我只是假設它以某種方式控制着它。