具有一定堆栈大小的进程?
C# 有没有办法启动具有特定堆栈大小的进程?
Is there a way in C# to start a process with a certain stack size?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
C# 有没有办法启动具有特定堆栈大小的进程?
Is there a way in C# to start a process with a certain stack size?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
一次投反对票的狂欢,我犹豫是否要发帖。但 Henrik 是对的,第一个线程是 Windows 在启动 EXE 时启动的。它完成了一大堆工作,加载 CLR 是它的职责之一。它运行程序中的 Main() 方法。
.NET 框架提供了很少的选项来配置该线程。只有 Main() 方法上的 [MTAThread] 和 [STAThread] 属性有所不同,它们会影响 CLR 调用 CoInitializeEx() API 函数的方式。
线程的堆栈大小实际上是可配置的。它是 PE32 文件格式中的字段之一,PE32 文件格式是 Windows 中用于可执行映像的格式。通常,C# 或 VB.NET 编译器负责生成该文件,但都没有设置初始线程堆栈大小的选项。有点疏忽。它们使用默认值,32 位 EXE 为 1 MB,64 位 EXE 为 4 MB(平台目标 = x64)。
可以更改该值,您可以运行 Editbin.exe 实用程序来修改 EXE 文件,使用 /STACK 命令行选项。您需要在构建后步骤中执行此操作。请注意,这与强名称或使用证书签名不兼容,因为它会修改 EXE 文件。
顺便说一句,这不是一个真正的问题,如果您需要一个具有大量堆栈空间的线程,那么您可以在 Main() 方法中自己创建一个线程。
A down-voting fest, I hesitate to post. But Henrik is right, the very first thread is started by Windows when it launches the EXE. It does a whole bunch of work, loading the CLR is one of its duties. And it runs the Main() method in your program.
The .NET framework gives very few options to configure that thread. Only the [MTAThread] and [STAThread] attributes on the Main() method makes a difference, they affect how the CLR calls the CoInitializeEx() API function.
The stack size of the thread is in fact configurable. It is one of the fields in the PE32 file format, the format used in Windows for executable images. Usually the C# or VB.NET compiler is responsible for generating that file, neither have an option to set the initial thread stack size. Bit of an oversight. They use defaults, one megabyte for a 32-bit EXE, four megabytes for a 64-bit EXE (Platform Target = x64).
Changing that value is possible, you can run the Editbin.exe utility to modify the EXE file, use the /STACK command line option. You'll want to do this in a post-build step. Beware that this is incompatible with strong names or signing with a certificate since it modifies the EXE file.
It isn't a real problem btw, if you need a thread with a lot of stack space then you create one yourself in the Main() method.
在此线程中,他们展示了一个 PoC,您可以使用 Editbin.exe 修改进入 main 的线程的默认堆栈大小:
http://bytes.com/topic/c-sharp/answers/ 229335-stack-size
如果您生成新线程,则有一个 API:
http://msdn.microsoft.com/en-us/library/ms149581。 ASPX
In this thread they show a PoC that you can use Editbin.exe to modify the default stack size of the thread that enters main:
http://bytes.com/topic/c-sharp/answers/229335-stack-size
and if you spawn new threads, there's an API for it:
http://msdn.microsoft.com/en-us/library/ms149581.aspx