我有一个asp.net(3.5)Web应用程序。 在一个页面中,我使用非托管C库(模拟器),它根据某些输入生成一组结果。
当我在web.config(发布模式)中设置debug="false"
时,该调用将导致System.AccessViolationException
。如果我在调试器中,或者至少在web.config中设置debug="true"
,则该异常将从不出现。
由于错误的性质,我将调用放在try-catch
内以记录异常,然后异常没有出现!
在调试模式和/或try-catch中,是否对受保护的内存空间有一些神奇的工作?
答案 0 :(得分:3)
AccessViolationException
可能意味着你的非托管C代码搞砸了。它覆盖了堆或其他东西。
请记住,许多代码片段从未被编写为在类似ASP.NET的多线程环境中运行。它们甚至从未在这样的环境中进行过测试,或者仅使用一些不适用于ASP.NET的“桌面”形式的多线程进行测试。
我有一次像这样的问题。声称是线程安全的第三方DLL非常不安全。通过将非托管调试器附加到ASP.NET工作进程,可以看到应用程序正在整个C运行时库堆中编写,并且堆对此抱怨不已。没有人听到这些抱怨。
必须在lock
块中包含对此代码的调用 - 以确保一次只能调用一个线程。这足以防止所有崩溃,即使在负载下也是如此。
这个仍然可能不适合所有非托管代码。假设所有调用都发生在同一个线程上的代码,或者来自同一个“会话”的所有调用都发生在同一个线程上的代码将会失望,并且可能会崩溃或做更糟糕的事情。在这种情况下,您可能需要将该代码移动到单独的Windows服务中,该服务只允许一个线程访问该库,永远。