gpt4 book ai didi

c# - System.AccessViolationException 的奇怪问题

转载 作者:行者123 更新时间:2023-11-30 12:16:28 25 4
gpt4 key购买 nike

我有一个 asp.net (3.5) 网络应用程序。在一个页面中,我使用了一个非托管 C 库(一个模拟器),它根据一些输入生成一组结果。

当我在 web.config( Release模式)中设置 debug="false" 时,该调用将导致 System.AccessViolationException。如果我在调试器中,或者至少在 web.config 中设置了 debug="true",则该异常将永远不会出现。

由于错误的性质,我将调用放在 try-catch 中以记录异常,然后异常就不会出现!

在 Debug模式和/或 try-catch 中, protected 内存空间是否有一些神奇的工作?

最佳答案

AccessViolationException 在这种情况下可能意味着您的非托管 C 代码搞砸了。它正在覆盖堆或其他东西。

请记住,许多代码片段从未编写为在像 ASP.NET 那样的多线程环境中运行。它们甚至从未在这样的环境中进行过测试,或者仅使用不适用于 ASP.NET 的某种“桌面”形式的多线程进行了测试。

我曾经遇到过这样的问题。声称线程安全的第三方 DLL 非常不安全。通过将非托管调试器附加到 ASP.NET 工作进程,可以看到应用程序正在整个 C 运行时库堆中写入,并且堆正在提示它。没有人在听提示。

有必要将对此代码的调用包装在 lock block 中 - 以确保一次只有一个线程可以调用它。这足以防止所有崩溃,即使在负载下也是如此。

仍然 可能不足以满足所有非托管代码的需求。假设所有调用都发生在同一个线程上,或者来自同一个“ session ”的所有调用都发生在同一个线程上的一段代码将会令人失望,并且很可能会崩溃或做一些更糟糕的事情。在这种情况下,您可能需要将该代码移动到一个单独的 Windows 服务中,该服务只允许一个线程访问该库,永远

关于c# - System.AccessViolationException 的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5353958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com