2014-01-14 190 views
0

我正在致力於通過DllImport調出到第三方庫的ASP.NET MVC應用程序。DllImport - 適用於測試環境,但不適用於ASP.NET MVC

最初,在測試DllImport如何使用MSTest工作時,我編寫了一些簡單的測試以確保正確使用它。我能夠使用整個API而沒有問題。由於抽象是圍繞進口建立的,測試繼續表明進口按預期工作,並且我能夠與外部API進行溝通。

現在我開始在ASP.NET MVC(而不是MSTest)的上下文中訪問該庫。每當我撥打電話的進口,我會遇到以下異常:

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 

有什麼我應該爲了在ASP.NET MVC使用DllImport在做什麼?

下面您可以找到初始化導入的示例。

[DllImport("pcrsrv32.dll", EntryPoint = "PCRSInitSrv", CallingConvention = CallingConvention.Cdecl)] 
public static extern int InitSrv(string callerName, string iniFile); 

當談到這是什麼樣子的第三方庫,我們只提供了什麼樣的C函數聲明如下所示:

HRESULT _PCRSFN PCRSInitSrv(const char *name, const char *iniFile); 

回答

0

使用進程監視器來分析訪問在MSTest的外部代碼VS ASP.NET MVC之間的差異之後,我發現,ASP.NET MVC無法找到很多的外部代碼依賴的文件。在查找文件時,我的PATH中包含的所有文件夾都被檢查過,但沒有發送到ini文件中的文件被髮送到外部軟件。當通過MSTest運行時,立即發現所有文件都沒有問題。

最後,我能夠通過將文件夾路徑添加到我的PATH變量中來「修復」問題。我對修復程序並不滿意,但它現在可以運行。

0

窗口默認通話約定是StdCall

嘗試使用:CallingConvention = CallingConvention.StdCall

+0

最初,我允許'CallingConvention'使用默認值。我最近才轉而嘗試使用'Cdecl'。我只是試圖明確地使用'StdCall'沒有運氣:( – Priz23

+0

你可以顯示代碼原始InitSrv方法的樣子嗎? – HABJAN

+0

我用C函數更新了這個問題。 – Priz23

相關問題