我嚴重懷疑我的問題是,由於一些安全問題,但這裏的完整描述,以防萬一我錯了。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服務正在調用的內容,但我已經運行了上述示例並獲得了我已解釋的行爲。
你的函數的c聲明是什麼 – rerun 2011-05-31 17:24:56
@rerun:我已經編輯了這個問題以包含完整性,但我的假設(它可能是錯誤的)是互操作調用正常工作,因爲它成功時從命令行項目運行。 – 2011-05-31 17:41:49
您的IIS服務器是否在64位操作系統中運行?你的dll是32位的嗎? – yms 2011-05-31 18:31:05