= 0) return; print("DOTNET VERSION MISMATCH: $dotnet_curr_ver < $version\n"); $install_file_path = self::getInstallerPath(); $version_parts = explode('.', $version); $channel = $version_parts[0].'.'.$version_parts[1]; if(self::isWin()) self::Shell("powershell -NoProfile -ExecutionPolicy unrestricted Invoke-Expression '\"$install_file_path\" -Channel $channel'"); else self::Shell("\"$install_file_path\" --channel $channel"); } static function getInstallerPath() : string { if(self::isWin()) return __DIR__ . "/dotnet-install.ps1"; else return __DIR__ . "/dotnet-install.sh"; } static function getPath() : string { if(self::isWin()) { $appdata_path = getenv('LOCALAPPDATA'); return "$appdata_path\\Microsoft\\dotnet\\"; } else { return getenv("HOME")."/.dotnet/"; } } static function isWin() : bool { return !(DIRECTORY_SEPARATOR == '/'); } static function shellGet(string $cmd, bool $as_string = true) { exec($cmd, $out, $code); if($code !== 0) throw new Exception("Error($code) executing shell cmd '$cmd'"); return $as_string ? implode("", $out) : $out; } static function shell(string $cmd) { system($cmd, $ret); if($ret != 0) throw new Exception("Shell execution error(exit code $ret)"); } }