/* static */ int fx_muxer_t::execute(const int argc, const pal::char_t* argv[]) { trace::verbose(_X("--- Executing in muxer mode...")); if (argc <= 1) { return muxer_usage(); } pal::string_t own_path; // Get the full name of the application if (!pal::get_own_executable_path(&own_path) || !pal::realpath(&own_path)) { trace::error(_X("Failed to locate current executable")); return StatusCode::LibHostCurExeFindFailure; } auto own_dir = get_directory(own_path); bool is_an_app = false; if (pal::strcasecmp(_X("exec"), argv[1]) == 0) { return parse_args_and_execute(own_dir, 2, argc, argv, true, &is_an_app); // arg offset 2 for dotnet, exec } int result = parse_args_and_execute(own_dir, 1, argc, argv, false, &is_an_app); // arg offset 1 for dotnet if (is_an_app) { return result; } // Could not execute as an app, try the CLI SDK dotnet.dll pal::string_t sdk_dotnet; if (!resolve_sdk_dotnet_path(own_dir, &sdk_dotnet)) { trace::error(_X("Could not resolve SDK directory from [%s]"), own_dir.c_str()); return StatusCode::LibHostSdkFindFailure; } append_path(&sdk_dotnet, _X("dotnet.dll")); if (!pal::file_exists(sdk_dotnet)) { trace::error(_X("Could not find dotnet.dll at [%s]"), sdk_dotnet.c_str()); return StatusCode::LibHostSdkFindFailure; } // Transform dotnet [command] [args] -> dotnet dotnet.dll [command] [args] std::vector<const pal::char_t*> new_argv(argc + 1); memcpy(&new_argv.data()[2], argv + 1, (argc - 1) * sizeof(pal::char_t*)); new_argv[0] = argv[0]; new_argv[1] = sdk_dotnet.c_str(); trace::verbose(_X("Using dotnet SDK dll=[%s]"), sdk_dotnet.c_str()); return parse_args_and_execute(own_dir, 1, new_argv.size(), new_argv.data(), false, &is_an_app); }
/* static */ int fx_muxer_t::execute(const int argc, const pal::char_t* argv[]) { pal::string_t own_path; // Get the full name of the application if (!pal::get_own_executable_path(&own_path) || !pal::realpath(&own_path)) { trace::error(_X("Failed to resolve full path of the current executable [%s]"), own_path.c_str()); return StatusCode::LibHostCurExeFindFailure; } pal::string_t own_name = get_filename(own_path); pal::string_t own_dir = get_directory(own_path); pal::string_t own_dll_filename = get_executable(own_name) + _X(".dll"); pal::string_t own_dll = own_dir; append_path(&own_dll, own_dll_filename.c_str()); trace::info(_X("Own DLL path=[%s]"), own_dll.c_str()); auto mode = detect_operating_mode(own_dir, own_dll, own_name); bool is_an_app = true; if (mode == host_mode_t::split_fx) { trace::verbose(_X("--- Executing in split/FX mode...")); return parse_args_and_execute(own_dir, own_dll, 1, argc, argv, false, host_mode_t::split_fx, &is_an_app); } if (mode == host_mode_t::standalone) { trace::verbose(_X("--- Executing in standalone mode...")); return parse_args_and_execute(own_dir, own_dll, 1, argc, argv, false, host_mode_t::standalone, &is_an_app); } trace::verbose(_X("--- Executing in muxer mode...")); if (argc <= 1) { return muxer_usage(); } if (pal::strcasecmp(_X("exec"), argv[1]) == 0) { return parse_args_and_execute(own_dir, own_dll, 2, argc, argv, true, host_mode_t::muxer, &is_an_app); // arg offset 2 for dotnet, exec } int result = parse_args_and_execute(own_dir, own_dll, 1, argc, argv, false, host_mode_t::muxer, &is_an_app); // arg offset 1 for dotnet if (is_an_app) { return result; } // Could not execute as an app, try the CLI SDK dotnet.dll pal::string_t sdk_dotnet; if (!resolve_sdk_dotnet_path(own_dir, &sdk_dotnet)) { assert(argc > 1); if (pal::strcasecmp(_X("--help"), argv[1]) == 0 || pal::strcasecmp(_X("--version"), argv[1]) == 0 || pal::strcasecmp(_X("-h"), argv[1]) == 0 || pal::strcasecmp(_X("-v"), argv[1]) == 0) { return muxer_usage(); } trace::error(_X("Did you mean to run dotnet SDK commands? Please install dotnet SDK from: ")); trace::error(_X(" %s"), s_dotnet_sdk_download_url); return StatusCode::LibHostSdkFindFailure; } append_path(&sdk_dotnet, _X("dotnet.dll")); if (!pal::file_exists(sdk_dotnet)) { trace::error(_X("Found dotnet SDK, but did not find dotnet.dll at [%s]"), sdk_dotnet.c_str()); return StatusCode::LibHostSdkFindFailure; } // Transform dotnet [command] [args] -> dotnet dotnet.dll [command] [args] std::vector<const pal::char_t*> new_argv(argc + 1); memcpy(&new_argv.data()[2], argv + 1, (argc - 1) * sizeof(pal::char_t*)); new_argv[0] = argv[0]; new_argv[1] = sdk_dotnet.c_str(); trace::verbose(_X("Using dotnet SDK dll=[%s]"), sdk_dotnet.c_str()); return parse_args_and_execute(own_dir, own_dll, 1, new_argv.size(), new_argv.data(), false, host_mode_t::muxer, &is_an_app); }