dotnet-installer/src/corehost/cli/args.cpp
2016-04-11 19:58:14 -07:00

100 lines
3.1 KiB
C++

// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
#include "args.h"
#include "utils.h"
#include "coreclr.h"
#include "libhost.h"
arguments_t::arguments_t() :
managed_application(_X("")),
own_path(_X("")),
app_dir(_X("")),
app_argc(0),
app_argv(nullptr),
dotnet_packages_cache(_X("")),
dotnet_extensions(_X("")),
deps_path(_X(""))
{
}
bool parse_arguments(
const pal::string_t& deps_path,
const std::vector<pal::string_t>& probe_paths,
host_mode_t mode,
const int argc, const pal::char_t* argv[], arguments_t* arg_out)
{
arguments_t& args = *arg_out;
// Get the full name of the application
if (!pal::get_own_executable_path(&args.own_path) || !pal::realpath(&args.own_path))
{
trace::error(_X("Failed to locate current executable"));
return false;
}
auto own_name = get_filename(args.own_path);
auto own_dir = get_directory(args.own_path);
if (mode != host_mode_t::standalone)
{
// corerun mode. First argument is managed app
if (argc < 2)
{
return false;
}
args.managed_application = pal::string_t(argv[1]);
if (!pal::realpath(&args.managed_application))
{
trace::error(_X("Failed to locate managed application: %s"), args.managed_application.c_str());
return false;
}
args.app_dir = get_directory(args.managed_application);
args.app_argc = argc - 2;
args.app_argv = &argv[2];
}
else
{
// coreconsole mode. Find the managed app in the same directory
pal::string_t managed_app(own_dir);
managed_app.push_back(DIR_SEPARATOR);
managed_app.append(get_executable(own_name));
managed_app.append(_X(".dll"));
args.managed_application = managed_app;
if (!pal::realpath(&args.managed_application))
{
trace::error(_X("Failed to locate managed application: %s"), args.managed_application.c_str());
return false;
}
args.app_dir = own_dir;
args.app_argv = &argv[1];
args.app_argc = argc - 1;
}
if (!deps_path.empty())
{
args.deps_path = deps_path;
args.app_dir = get_directory(args.deps_path);
}
for (const auto& probe : probe_paths)
{
args.probe_paths.push_back(probe);
}
if (args.deps_path.empty())
{
const auto& app_base = args.app_dir;
auto app_name = get_filename(args.managed_application);
args.deps_path.reserve(app_base.length() + 1 + app_name.length() + 5);
args.deps_path.append(app_base);
args.deps_path.push_back(DIR_SEPARATOR);
args.deps_path.append(app_name, 0, app_name.find_last_of(_X(".")));
args.deps_path.append(_X(".deps.json"));
}
pal::getenv(_X("DOTNET_HOSTING_OPTIMIZATION_CACHE"), &args.dotnet_packages_cache);
pal::get_default_extensions_directory(&args.dotnet_extensions);
return true;
}