从托管应用程序调用的本机DLL的堆栈溢出

当我调用本机DLL时,我从我的应用程序中得到了臭名昭着的0xC00000FD (堆栈溢出)exception。 这是通过Windows CE 5(SH4处理器)上的托管C#应用程序完成的。 使用相同的托管应用程序为Windows XP编译相同的DLL,一切正常(没有溢出)。 DLL中的例程正在进行一些非常复杂的递归,这最终导致溢出,但同样,它在PC上运行良好。

看起来我可能只需要在构建DLL时调整堆栈大小? 我相信使用Visual C编译器时,CE和XP的默认堆栈大小都是1MB(我使用Visual Studio 2005,如果这很重要)。 如果它们都默认为相同的大小,我不确定为什么会溢出而另一个不会。 我尝试使用/ F编译器标志和/ STACK链接器标志调整堆栈大小,但似乎没有做任何事情。 我也不完全清楚我可以在DLL中指定堆栈大小,而是可执行文件必须设置它。 但是,如果是这样的话,我如何调整托管进程在调用本机DLL时使用的堆栈大小?

这是一个关于Windows CE 内存架构讨论的链接。

最终,您无法以编程方式或在编译时调整堆栈大小; 操作系统会根据许多因素(包括内存可用性)来改变它。 使用/ F设置堆栈大小仅设置可以(通常将)被OS忽略的默认值。 无论如何,/ F对.DLL不起作用; 它只在编译可执行文件时有效。 .DLL没有堆栈; 属于线程并且(最终)属于进程。

可能是时候回到绘图板去除你的递归了。