如何解决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服务正在调用的项目,但是我已经运行了上面的示例并获得了我所解释的行为。
解决方法
如果IIS服务器在64位操作系统上运行,则应显式地使用目标CPU = X86构建项目,否则它将被视为AnyCPU,并且jit可能会为其生成64位本机代码。完成此操作后,您可以在IIS中启用32位应用程序,并且您的项目应该可以运行。
其他要检查的是您的asp.net应用程序实际上找到了您的dll。
, 问题最终是我没有正确初始化C-API。有一个函数调用会初始化整个API,而当我在UnitTests中执行此操作时,却忘记了在网络服务中执行此操作。
谢谢大家的帮助,我觉得我已经学到了很多有关ASP.NET安全模型和.NET信任实现的知识。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。