2011-05-31 51 views
5

我嚴重懷疑我的問題是,由於一些安全問題,但這裏的完整描述,以防萬一我錯了。ASP.NET的DllImport會導致應用程序以退出

我最初寫在C(不是C++)的DLL。我使用DllImport來調用這個庫中的方法。的聲明看起來是這樣的:

[DllImport(@"MyAntiquatedLibrary.dll") 
[SecurityPermission(SecurityAction.Assert, Unrestricted = true)] 
internal static extern void GetConnectionString(string port, string server, string instance, [Out] StringBuilder output); 

在頭文件中的C定義是這樣的:

void GetConnectionString(const char far *Portname, const char far *ServerName const char far *InstanceName, char far *retConnectionName); 

所以我在Visual Studio中,其代碼隱藏容貌在我的WebApplication項目中創建一個示例頁面像這樣:

protected void Page_Load(object sender, EventArgs e) 
{ 
    try 
    { 
    var connectionString = new StringBuilder(); 
    GetConnectionString(null, "myHost", "myInstance", connectionString); 
    MyLabel.Text = connectionString.ToString(); 
    } 
    catch(Exception ex) 
    { 
    MyLabel.Text = string.Format("Something went wrong: {0}", ex.Message); 
    } 
} 

當我調試程序,並逐步進行GetConnectionString()方法調用我得到一個:

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

我看到與我在WebApplication項目中從Web服務或網頁中的interop DLL進行的任何調用相同的問題。在我測試這個時寫的ConsoleApplication中,相同的調用序列工作正常。從WindowsConsole應用程序調用時

相同的代碼工作正常。這個例子從實際使用中簡化了一點,但結果是一樣的。在真正的解決方案中,我有一個項目負責管理與C-API的交互,這就是我的web服務正在調用的內容,但我已經運行了上述示例並獲得了我已解釋的行爲。

+0

你的函數的c聲明是什麼 – rerun 2011-05-31 17:24:56

+0

@rerun:我已經編輯了這個問題以包含完整性,但我的假設(它可能是錯誤的)是互操作調用正常工作,因爲它成功時從命令行項目運行。 – 2011-05-31 17:41:49

+1

您的IIS服務器是否在64位操作系統中運行?你的dll是32位的嗎? – yms 2011-05-31 18:31:05

回答

1

問題結束了,我是不正確初始化C-API。有一個函數調用初始化了整個API,當我在UnitTests中這樣做時,我忘記了在web服務中這樣做。

謝謝大家的幫助,雖然,我覺得我已經學到了很多關於ASP.NET安全模型和.NET信任的實現。

1

如果你的IIS服務器在64位操作系統上運行,你應該建立你的目標CPU計劃= X86明確,否則將被視爲AnyCPU和JIT可能會產生64位本機代碼吧。這樣做後,您可以啓用IIS中的32位應用程序,並且您的項目應該可以工作。 還有一件事要檢查,就是你的dll實際上是由你的asp.net應用程序找到的。

相關問題