【问题标题】:Stack overflow in c# app using c++ dll使用 c++ dll 在 c# 应用程序中的堆栈溢出
【发布时间】:2011-04-05 11:35:58
【问题描述】:

我有一个使用 c++/cli 托管 dll 的 c# 程序。该dll包含大量遗留代码,由不少win32窗口组成。

问题是,dll 中的窗口比一般情况需要更多的堆栈空间。由于这些不是后台进程而是win32 api我需要扩大GUI线程的堆栈大小(至少我认为dll中的win32 api会使用主gui进程)。

所以我需要一种方法来扩大 c# 进程中 GUI 线程的大小。

由于我没有找到可以实现此目的的设置,因此我从命令行尝试了 editbin /STACK,它有效。问题是,它仅在命令行中有效,如果我出于某种原因尝试将其作为构建后步骤输入,则二进制文件的堆栈大小不会改变,即使构建后步骤已正确执行并且没有引发错误:(

editbin.exe /STACK:2097152 $(TargetPath)

(Editbin.exe在路径中,输出窗口没有错误)

那么如何为我的 c++ dll 获得更多的堆栈大小?

[更新]

我注意到使用 editbin.exe 时出现问题。

这不起作用,无论是在命令行中还是在构建后步骤中:

editbin.exe /STACK:2097152 c:\some\path\bin\release\app.exe

这确实可以在命令行中使用,但不能作为构建步骤:

editbin.exe /STACK:2097152 app.exe

但我需要它作为后期构建步骤。我试图把它放到一个批处理文件中,回显以确保调用和工作目录都可以,但它仍然不起作用。奇怪。

【问题讨论】:

  • 你试过用批处理文件包装你的命令吗?那会让它更像命令行,所以也许它可以解决问题。
  • 你也可以发布你的 Post-Build-Macro 吗?也许我们可以在那里找到错误。
  • herenvardo,我尝试将其放入 cmd,但无济于事:(
  • @Bobby,发布了后期构建步骤。
  • @Sam:在我看来应该可以工作...路径中有空格吗?喜欢editbin.exe /STACK:2097152 "$(TargetPath)"

标签: c# dll c++-cli stack-overflow


【解决方案1】:

这应该不起作用,奇怪的是您没有收到构建错误。路径设置不正确,无法在 C# 构建中使用该工具。它确实可以从命令行工作,Visual Studio 命令提示符使用 C/C++ 项目的配置。此构建后命令在 VS2008 中正常工作:

set path=%path%;$(DevEnvDir);$(DevEnvDir)..\..\vc\bin
editbin.exe /STACK:2097152 "$(TargetPath)"

还要注意目标路径宏周围的双引号以处理空格。

【讨论】:

  • 啊,是的,搜索路径是问题!我添加了 \vc\bin 的路径,但另一个路径仍然丢失,所以它既没有工作也没有报错。
  • 我相信使用 call "$(DevEnvDir)..\..\VC\vcvarsall.bat" 开始您的后期构建步骤会更加稳健。我就是这么做的。
【解决方案2】:

这有帮助吗? /F (Set Stack Size)

这基本上是提供 /F 开关以及要为堆栈保留的字节数。

【讨论】:

  • 这是我所需要的,但是对于 c# 程序我应该把它放在哪里呢?
  • 此选项适用于 C++ 编译器,而非 C# 编译器。
  • 是的 - 因为我的程序是一个 c# 程序,所以不能为它设置选项。
猜你喜欢
  • 2014-04-12
  • 2013-12-12
  • 2010-11-05
  • 1970-01-01
  • 2010-09-22
  • 2012-12-20
  • 2011-03-02
  • 2014-01-17
相关资源
最近更新 更多