CSharp 脚本,是否可以 return 来自脚本 运行 和 csi.exe 的值?
CSharp scripting, is it possible to return a value from a script run with csi.exe?
我想创建这样的脚本:
static int Main(string[] args)
{
if ( !File.Exists( @"E:\Ivara\Cache\TimeCacheLastUpdated.txt" ) )
{
return -1;
}
return 6;
}
并且运行它是这样并得到错误级别:
"C:\Program Files (x86)\Microsoft Visual Studio17\Professional\MSBuild.0\Bin\Roslyn\csi.exe" E:\build\CruiseControl\bin\TestLoggingConfigExists.csx
ECHO %ERRORLEVEL%
您正在 运行ning 的程序将是 csi.exe
,因此 %ERRORLEVEL%
将反映该程序的退出代码(即编译成功时为零,非零否则),而不是 运行s 的脚本。
想到的几个选项:
改用 csc.exe
从脚本生成可执行应用程序。 运行 并捕获其退出代码。
如果出于某种原因所有这些都需要一次性完成,请创建一个将脚本路径作为输入参数的小应用程序,生成 csc.exe
以生成可执行文件,运行 它,并整理它的退出代码。 (或使用内存中编译 + 执行替代方案:https://josephwoodward.co.uk/2016/12/in-memory-c-sharp-compilation-using-roslyn)
编辑 2:这次简单多了
在脚本末尾将退出代码传递给 Environment.Exit 即可。
static int Main(string[] args)
{
if ( !File.Exists( @"E:\Ivara\Cache\TimeCacheLastUpdated.txt" ) )
{
return -1;
}
return 6;
}
// csi.exe normally ignores the exit code from Main, but we can terminate
// the csi.exe process abruptly, and forward the exit code to the caller.
Environment.Exit(Main(Args.ToArray()));
我想创建这样的脚本:
static int Main(string[] args)
{
if ( !File.Exists( @"E:\Ivara\Cache\TimeCacheLastUpdated.txt" ) )
{
return -1;
}
return 6;
}
并且运行它是这样并得到错误级别:
"C:\Program Files (x86)\Microsoft Visual Studio17\Professional\MSBuild.0\Bin\Roslyn\csi.exe" E:\build\CruiseControl\bin\TestLoggingConfigExists.csx
ECHO %ERRORLEVEL%
您正在 运行ning 的程序将是 csi.exe
,因此 %ERRORLEVEL%
将反映该程序的退出代码(即编译成功时为零,非零否则),而不是 运行s 的脚本。
想到的几个选项:
改用
csc.exe
从脚本生成可执行应用程序。 运行 并捕获其退出代码。如果出于某种原因所有这些都需要一次性完成,请创建一个将脚本路径作为输入参数的小应用程序,生成
csc.exe
以生成可执行文件,运行 它,并整理它的退出代码。 (或使用内存中编译 + 执行替代方案:https://josephwoodward.co.uk/2016/12/in-memory-c-sharp-compilation-using-roslyn)
编辑 2:这次简单多了
在脚本末尾将退出代码传递给 Environment.Exit 即可。
static int Main(string[] args)
{
if ( !File.Exists( @"E:\Ivara\Cache\TimeCacheLastUpdated.txt" ) )
{
return -1;
}
return 6;
}
// csi.exe normally ignores the exit code from Main, but we can terminate
// the csi.exe process abruptly, and forward the exit code to the caller.
Environment.Exit(Main(Args.ToArray()));