ASP.NET DllImport导致应用程序退出
本文关键字:应用程序 退出 NET DllImport ASP | 更新日期: 2023-09-27 17:58:08
我非常怀疑我的问题是由于一些安全问题引起的,但这里有完整的描述,以防我弄错了。
我有一个DLL,它最初是用C(而不是C++)编写的。我正在使用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服务或网页对互操作DLL进行的任何调用都会遇到同样的问题。同样的调用序列在我测试时编写的ConsoleApplication中运行良好。
从WindowsConsole应用程序调用时,同样的代码也可以正常工作。这个例子从实际使用中简化了一点,但结果是一样的。在真正的解决方案中,我有一个项目只负责管理与C-API的交互,这就是我的Web服务所调用的,但我已经运行了上面的示例,并获得了我所解释的行为。
如果您的IIS服务器运行在64位操作系统中,您应该显式地使用目标CPU=X86构建项目,否则它将被视为AnyCPU,jit可能会为其生成64位本机代码。完成此操作后,您可以在IIS中启用32位应用程序,您的项目应该可以工作。需要检查的另一件事是,你的asp.net应用程序确实找到了你的dll。
最终的问题是我没有正确初始化C-API。有一个函数调用初始化整个API,当我在UnitTest中这样做时,我忘记了在Web服务中这样做。
不过,感谢大家的帮助,我觉得我已经学到了很多关于ASP.NET安全模型和.NET信任实现的知识。