我的目標是通過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
尋找的路徑,如果沒有,有沒有辦法獲得默認路徑,以便我可以在啓動時複製所需的文件?
謝謝
可能是任何東西。沒有任何細節,我們只能推測和猜測。 –
作爲後續工作,DLL現在是線程安全的,但仍然在ASP.NET中崩潰。作者還添加了一個可以成功調用的空方法,所以它與加載庫無關,而是真正執行其他方法。我現在正在探索的軌道是,DLL必須加載必須位於同一文件夾級別的其他文件;不會感到驚訝的是,這在ASP.NET中或更確切地說在IIS中不起作用。 – ThomasWeiss
明白!我發現它來自DLL加載的外部文件,因爲系統試圖在我的開發機器上的「C:\ Program Files(x86)\ IIS Express」中找到它們。如果我把文件放在那裏,它就像一個魅力。我正在編輯相應的問題。 – ThomasWeiss