2013-10-27 23 views
0

我的目標是通過ASP.NET應用程序中的P/Invoke調用本地DLL。到目前爲止,我可以成功地從控制檯應用程序調用DLL,甚至可以從在Azure WorkerRole中託管的HttpListener上運行的OWIN服務器調用該DLL。P/Invoke在ASP.NET中給出AccessViolationException

當我嘗試在ASP.NET/IIS中託管完全相同的代碼時,出現問題時,無論是在簡單的ASP.NET應用程序中還是在Azure WebRole中。在這種情況下,對DLL的調用會引發AccessViolationException。

從我的研究看來,問題可能來自於本機DLL不是線程安全的事實 - 即使在控制檯應用程序中試圖從併發線程調用它的測試也會拋出AVE,這表明它確實不是線程安全的。所以我正在檢查這個DLL的作者。

但是在此期間,我還在想這是否是ASP.NET/IIS崩潰的根本原因,因爲在我的測試中,我一次只做一個請求。因此,等待線程安全得到解決,我想知道你們是否會意識到其他特定信息可能導致P/Invoke在ASP.NET/IIS中失敗。

UPDATE

根據我無數次的試驗,事實證明,墜機是由DLL試圖加載外部文件引起的。在非IIS應用程序中,將這些文件放在與DLL相同的文件夾級別上;但是在我的開發機器上,例如,運行在IIS上的相同代碼嘗試在「C:\ Program Files(x86)\ IIS Express」中查找這些文件。

所以我現在的問題是:有沒有辦法控制一個簡單的File.Open尋找的路徑,如果沒有,有沒有辦法獲得默認路徑,以便我可以在啓動時複製所需的文件?

謝謝

+0

可能是任何東西。沒有任何細節,我們只能推測和猜測。 –

+0

作爲後續工作,DLL現在是線程安全的,但仍然在ASP.NET中崩潰。作者還添加了一個可以成功調用的空方法,所以它與加載庫無關,而是真正執行其他方法。我現在正在探索的軌道是,DLL必須加載必須位於同一文件夾級別的其他文件;不會感到驚訝的是,這在ASP.NET中或更確切地說在IIS中不起作用。 – ThomasWeiss

+0

明白!我發現它來自DLL加載的外部文件,因爲系統試圖在我的開發機器上的「C:\ Program Files(x86)\ IIS Express」中找到它們。如果我把文件放在那裏,它就像一個魅力。我正在編輯相應的問題。 – ThomasWeiss

回答

0

你觀察到的只是表示你使用相對路徑。這意味着,在IIS Express(不是IIS)下運行時,該進程將嘗試在C:\Program Files (x86)\IIS Express下進行搜索,因爲它假定這是解釋相對路徑時要使用的基本目錄。

你應該總是使用絕對路徑而不是相對路徑,然後這個問題就不會發生。

http://msdn.microsoft.com/en-us/library/ms178116(v=vs.100).aspx

+0

我沒有任何控制,因爲本地DLL不是(也不應該)知道執行上下文;它只是試圖在「當前文件夾」中打開它需要的文件。所以我需要實現的是控制「當前文件夾」是什麼,無論執行上下文是什麼,尤其是在ASP.NET中。 – ThomasWeiss

+0

@ThomasWeiss在這種情況下,你唯一的希望就是修補dll。無法更改IIS或IIS Express的工作目錄,因爲這可能會導致您不會期望的其他問題。 –

+0

而如果在啓動時,我調用Directory.GetCurrentDirectory()並複製DLL所需的文件在那裏? – ThomasWeiss

0

請不要耍弄周圍的每一個應用程序啓動文件複製,只能去南方。

更好的解決方案是讓DLL的提供者添加一些代碼來檢查Windows註冊表中的路徑值。如果該值存在於註冊表中,則DLL將嘗試從該值中的路徑加載其關聯的庫;否則它會回退試圖從DLL的當前目錄加載它們。

相關問題