- Какое решение лучше?
- Какое решение лучше?
Первый подход с использованием editbin
в событии после сборки завершается неудачей при использовании ключа строгого имени для подписи сборки. После изменения сборки с помощью editbin
проверка подписанной сборки не удастся. sn.exe -v assembly.exe
вернет Failed to verify assembly -- Strong name validation failed ...
Смотрите также:
Использование события AfterCompile
и отставка сборки - это обходной путь (который я сейчас использую). Файл проекта должен содержать следующие строки:
<Target Name="AfterCompile">
<Exec Command="
"$(DevEnvDir)..\..\VC\bin\editbin.exe" /STACK:16777216 "$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)"
"$(FrameworkSDKDir)bin\NETFX 4.5.1 Tools\sn.exe" -Ra "$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)" "$(SolutionDir)\STRONGNAME.snk"
" />
</Target>
<PropertyGroup>
<PostBuildEvent>REM "See AfterCompile for stack size and resigning"</PostBuildEvent>
</PropertyGroup>
Я узнал о событии после компиляции, когда читал следующий ответ: https://stackoverflow.com/a/22617361/7556646
Второй подход , но для программы отверстий, а не только для блоков рекурсивного кода, будет выглядеть так:
static class Program
{
[STAThread]
static void Main(string[] args)
{
Thread thread = new Thread(delegate()
{
Main2(args);
}, 16 * 1024 * 1024);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
static void Main2(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(app);
}
}
Второй подход имеет тот недостаток, что размер стека события BackgroundWorker DoWork по-прежнему составляет 1 МБ (32-разрядный или любой) или 4 МБ (64-разрядный).
Смотрите также:
- В чем недостаток создания нового потока с большим размером стека для этого вычисления?
- Какой будет разумный размер стека?
См. Комментарии Ганса Пассанта.