代码之家  ›  专栏  ›  技术社区  ›  RandomEngy

如果预先分配了太多内存,p-invoke调用将失败

  •  0
  • RandomEngy  · 技术社区  · 14 年前

    我有一个对非托管dll的p-invoke调用,它在我的wpf应用程序中失败,但在一个简单的starter wpf应用程序中失败。我试图找出问题所在,但最终得出的结论是,如果在打电话之前分配了太多内存,那么电话就失败了。我有两个单独的代码块,这两个代码块都会自己成功,但是如果两个代码块都运行的话,这会导致失败。(它们与p-invoke调用尝试执行的操作无关)。

    非托管库中的哪些问题会导致此类问题?我认为托管和非托管堆应该是自动分离的。

    据我所知,崩溃发生在一个动态加载的辅助dll中,该dll来自一个调用了的p。这跟它有什么关系吗?

    2 回复  |  直到 14 年前
        1
  •  0
  •   Hans Passant    14 年前

    非托管代码容易损坏堆。这种损坏的副作用是不可预知的,这取决于损坏的内存之后会发生什么。如果腐败不在一个关键的位置,就不会发生什么坏事,这并不罕见。改变程序的内存分配模式可以改变结果。

    你现在真正知道的是,非托管代码不能被信任。做一些关于它的事情总是很困难的,特别是从托管主机程序。直到你开始为这个非托管代码编写单元测试,使用非托管代码来执行它,并找到一个可以用非托管调试器处理的可复制炸弹,你才能找到任何地方。

        2
  •  0
  •   Chris Taylor    14 年前

    在黑暗中拍摄,因为没有太多的信息可供使用。

    是否可能需要在特定的基地址加载非托管dll,并且当您分配了太多内存或加载了其他程序集时,该dll无法在正确的地址加载。

    http://msdn.microsoft.com/en-us/library/w368ysh2.aspx