--- lang: ja-jp breaks: true --- # C# 実行されているアプリケーションのスタックサイズを取得する方法 2022-07-21 > Checking stack size in C# > https://stackoverflow.com/questions/2901185/checking-stack-size-in-c-sharp ## 確認するプログラム ```csharp= public static class Extensions { public static void StartAndJoin(this Thread thread, string header) { thread.Start(header); thread.Join(); } } internal class Program { [DllImport("kernel32.dll")] static extern void GetCurrentThreadStackLimits(out uint lowLimit, out uint highLimit); static void WriteAllocatedStackSize(object header) { GetCurrentThreadStackLimits(out var low, out var high); Console.WriteLine($"{header,-19}: {((high - low) / 1024),4} KB"); } static void Main(string[] args) { Console.WriteLine("ビルドログ確認 OLD"); WriteAllocatedStackSize("Main Stack Size"); new Thread(WriteAllocatedStackSize, 1024 * 0).StartAndJoin("Default Stack Size"); new Thread(WriteAllocatedStackSize, 1024 * 128).StartAndJoin(" 128 KB Stack Size"); new Thread(WriteAllocatedStackSize, 1024 * 256).StartAndJoin(" 256 KB Stack Size"); new Thread(WriteAllocatedStackSize, 1024 * 512).StartAndJoin(" 512 KB Stack Size"); new Thread(WriteAllocatedStackSize, 1024 * 1024).StartAndJoin(" 1 MB Stack Size"); new Thread(WriteAllocatedStackSize, 1024 * 2048).StartAndJoin(" 2 MB Stack Size"); new Thread(WriteAllocatedStackSize, 1024 * 4096).StartAndJoin(" 4 MB Stack Size"); new Thread(WriteAllocatedStackSize, 1024 * 8192).StartAndJoin(" 8 MB Stack Size"); Console.ReadLine(); } } ``` ## Release/Any CPU ### `.NET Framework 4.8`(旧csproj) ```shell= Main Stack Size : 1024 KB Default Stack Size : 1024 KB 128 KB Stack Size : 256 KB 256 KB Stack Size : 256 KB 512 KB Stack Size : 512 KB 1 MB Stack Size : 1024 KB 2 MB Stack Size : 2048 KB 4 MB Stack Size : 4096 KB 8 MB Stack Size : 8192 KB ``` ### `net48` ```shell= Main Stack Size : 1024 KB Default Stack Size : 1024 KB 128 KB Stack Size : 256 KB 256 KB Stack Size : 256 KB 512 KB Stack Size : 512 KB 1 MB Stack Size : 1024 KB 2 MB Stack Size : 2048 KB 4 MB Stack Size : 4096 KB 8 MB Stack Size : 8192 KB ``` ### `net6.0` ```shell= Main Stack Size : 1536 KB Default Stack Size : 1536 KB 128 KB Stack Size : 128 KB 256 KB Stack Size : 256 KB 512 KB Stack Size : 512 KB 1 MB Stack Size : 1024 KB 2 MB Stack Size : 2048 KB 4 MB Stack Size : 4096 KB 8 MB Stack Size : 8192 KB ``` ## Release/x64 ### `.NET Framework 4.8`(旧csproj) ```shell= Main Stack Size : 4096 KB Default Stack Size : 4096 KB 128 KB Stack Size : 256 KB 256 KB Stack Size : 256 KB 512 KB Stack Size : 512 KB 1 MB Stack Size : 1024 KB 2 MB Stack Size : 2048 KB 4 MB Stack Size : 4096 KB 8 MB Stack Size : 8192 KB ``` ### `net48` ```shell= Main Stack Size : 4096 KB Default Stack Size : 4096 KB 128 KB Stack Size : 256 KB 256 KB Stack Size : 256 KB 512 KB Stack Size : 512 KB 1 MB Stack Size : 1024 KB 2 MB Stack Size : 2048 KB 4 MB Stack Size : 4096 KB 8 MB Stack Size : 8192 KB ``` ### `net6.0` ```shell= Main Stack Size : 1536 KB Default Stack Size : 1536 KB 128 KB Stack Size : 128 KB 256 KB Stack Size : 256 KB 512 KB Stack Size : 512 KB 1 MB Stack Size : 1024 KB 2 MB Stack Size : 2048 KB 4 MB Stack Size : 4096 KB 8 MB Stack Size : 8192 KB ``` ## 結果 * `net48` では、オールドスタイル/SDKスタイルによる違いはなく、`Any CPU` では `1024 KB`、`x64`では `4096 KB`。 * `net6.0` では、`Any CPU`/`x64`に違いはなく、`1536 KB`。 ###### tags: `C#` `スタックサイズ` `StackOverflowException`