Консольные компиляторы PascalABC.NET

Итак, решил написать сюда. Я подключаю компилятор к проекту http://olymp.krsu.edu.kg, так как очень много запросов на него. Но есть проблема:

Loading core…

Unhandled Exception: System.TypeInitializationException: The type initializer for ‘PascalABCCompiler.Compiler’ threw an exception. —> System.ArgumentNullException: Value cannot be null. Parameter name: path1 at System.IO.Path.Combine(String path1, String path2) at PascalABCCompiler.Compiler.get_standart_assembly_path(String name) at PascalABCCompiler.Compiler…cctor() — End of inner exception stack trace — at PascalABCCompiler.Compiler…ctor(SourceFilesProviderDelegate SourceFilesProvider, ChangeCompilerStateEventDelegate ChangeCompilerState) at PascalABCCompiler.ConsoleCompiler.Reset() at PascalABCCompiler.ConsoleCompiler.Main(String[] initialArgs)

Эта ошибка выдается, если пытаться запустить компилятор из Windows командой: CreateProcessAsUser(user, nullptr, buf1, nullptr, nullptr, true, CREATE_UNICODE_ENVIRONMENT|BELOW_NORMAL_PRIORITY_CLASS, env, path.c_str(), &startup, &info);

Вот что в командной строке: “…\Judge\Langs\pascalABC\pabcnetc.exe” “…\Judge\Running\000265158PHQGH_temp0000\Solution.pas” Solution exe /noconsole

Причем если запустить командную строку из под этого пользователя и выполнить команду к ней, то все хорошо. Не работает именно CreateProcessAsUser (ну или можно попробовать смоделировать с помощью runas и напрямую выполнить то, что должно выполняться).

Я уже смотрел исходники PascalABC.NET на github, но понять причину так и не смог - почему этот параметр не доходит до командной строки?

Версия консольного компилятора последняя с сайта - 3.5.1.2290

Что с этим можно сделать? С остальными языками проблем нет.

Ну, исходя из текста ошибки - могу предположить что Enviroment.CurrentDirectory каким то образом оказалось null. Попробуйте ручками передать, какая папка должна быть текущей, при запуске своим CreateProcessAsUser. Но я в C++ процессы ещё не запускал, так что как это делается - не представляю.

Компилятор может компилировать либо какой-то конкретный файл (.pas или проект), либо файлы по маске (*.pas).

В .get_standart_assembly_path все Path.Combine сшивают папку стандартного расположения assembly и имена стандартных assembly. Скорее всего первое не находится, что странно. Enviroment.CurrentDirectory тут вроде ни при чём.

Еще раз - судя по ошибке командная строка тут ни при чём - в get_standart_assembly_path просто инициализируется компилятор и загружаются все стандартные dll: mscorlib.dll",“System.dll”, “System.Core.dll”, “System.Numerics.dll”, “System.Windows.Forms.dll”, “PABCRtl.dll”

Все, нашел. Не было переменной среды windir. По умолчанию она называется SystemRoot. Почему-то у вас она называется windir. Наверно надо написать условие, если нет windir, получить SystemRoot.

вот эта строчка: string windir = Path.Combine(Environment.GetEnvironmentVariable(“windir”), “Microsoft.NET”);

Спасибо большое всем и с Новым Годом!

1 лайк

"Для все адептов языка Паскаль - подключен компилятор PascalАВС.NЕТ 3.5.1.2290. Пользуйтесь! "

Как распробуют, остальные языки забросят. Писать быстрее и короче, чем на любом другом языке, библиотек подключать не надо, все “в одном флаконе”.

1 лайк