Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/installer/corehost/corehost.cpp')
-rw-r--r--src/installer/corehost/corehost.cpp141
1 files changed, 58 insertions, 83 deletions
diff --git a/src/installer/corehost/corehost.cpp b/src/installer/corehost/corehost.cpp
index 55b8ed62982..bb6b4ce60e5 100644
--- a/src/installer/corehost/corehost.cpp
+++ b/src/installer/corehost/corehost.cpp
@@ -11,7 +11,8 @@
#include "utils.h"
#if defined(FEATURE_APPHOST)
-#include "bundle_marker.h"
+#include "cli/apphost/bundle/marker.h"
+#include "cli/apphost/bundle/runner.h"
#if defined(_WIN32)
#include "cli/apphost/apphost.windows.h"
@@ -83,14 +84,6 @@ bool is_exe_enabled_for_execution(pal::string_t* app_dll)
#define CURHOST_EXE
#endif
-void need_newer_framework_error()
-{
- pal::string_t url = get_download_url();
- trace::error(_X(" _ To run this application, you need to install a newer version of .NET Core."));
- trace::error(_X(""));
- trace::error(_X(" - %s&apphost_version=%s"), url.c_str(), _STRINGIFY(COMMON_HOST_PKG_VER));
-}
-
#if defined(CURHOST_EXE)
int exe_start(const int argc, const pal::char_t* argv[])
@@ -104,8 +97,8 @@ int exe_start(const int argc, const pal::char_t* argv[])
pal::string_t app_path;
pal::string_t app_root;
- bool requires_hostfxr_startupinfo_interface = false;
-
+ bool requires_v2_hostfxr_interface = false;
+
#if defined(FEATURE_APPHOST)
pal::string_t embedded_app_name;
if (!is_exe_enabled_for_execution(&embedded_app_name))
@@ -122,17 +115,29 @@ int exe_start(const int argc, const pal::char_t* argv[])
auto pos_path_char = embedded_app_name.find(DIR_SEPARATOR);
if (pos_path_char != pal::string_t::npos)
{
- requires_hostfxr_startupinfo_interface = true;
+ requires_v2_hostfxr_interface = true;
}
- app_path.assign(get_directory(host_path));
- append_path(&app_path, embedded_app_name.c_str());
+ if (bundle::marker_t::is_bundle())
+ {
+ bundle::runner_t bundle_runner(host_path);
+ StatusCode bundle_status = bundle_runner.extract();
+
+ if (bundle_status != StatusCode::Success)
+ {
+ trace::error(_X("A fatal error was encountered. Could not extract contents of the bundle"));
+ return bundle_status;
+ }
- if (bundle_marker_t::is_bundle())
+ app_path.assign(bundle_runner.extraction_dir());
+ }
+ else
{
- trace::info(_X("Detected Single-File app bundle"));
+ app_path.assign(get_directory(host_path));
}
- else if (!pal::realpath(&app_path))
+
+ append_path(&app_path, embedded_app_name.c_str());
+ if (!pal::realpath(&app_path))
{
trace::error(_X("The application to execute does not exist: '%s'."), app_path.c_str());
return StatusCode::LibHostAppRootFindFailure;
@@ -195,88 +200,58 @@ int exe_start(const int argc, const pal::char_t* argv[])
// Obtain the entrypoints.
int rc;
-#if defined(FEATURE_APPHOST)
- if (bundle_marker_t::is_bundle())
- {
- hostfxr_main_bundle_startupinfo_fn hostfxr_main_bundle_startupinfo = reinterpret_cast<hostfxr_main_bundle_startupinfo_fn>(pal::get_symbol(fxr, "hostfxr_main_bundle_startupinfo"));
- if (hostfxr_main_bundle_startupinfo != nullptr)
- {
- const pal::char_t* host_path_cstr = host_path.c_str();
- const pal::char_t* dotnet_root_cstr = dotnet_root.empty() ? nullptr : dotnet_root.c_str();
- const pal::char_t* app_path_cstr = app_path.empty() ? nullptr : app_path.c_str();
- int64_t bundle_header_offset = bundle_marker_t::header_offset();
-
- trace::info(_X("Invoking fx resolver [%s] hostfxr_main_bundle_startupinfo"), fxr_path.c_str());
- trace::info(_X("Host path: [%s]"), host_path.c_str());
- trace::info(_X("Dotnet path: [%s]"), dotnet_root.c_str());
- trace::info(_X("App path: [%s]"), app_path.c_str());
- trace::info(_X("Bundle Header Offset: [%lx]"), bundle_header_offset);
-
- hostfxr_set_error_writer_fn set_error_writer_fn = reinterpret_cast<hostfxr_set_error_writer_fn>(pal::get_symbol(fxr, "hostfxr_set_error_writer"));
- propagate_error_writer_t propagate_error_writer_to_hostfxr(set_error_writer_fn);
- rc = hostfxr_main_bundle_startupinfo(argc, argv, host_path_cstr, dotnet_root_cstr, app_path_cstr, bundle_header_offset);
- }
- else
- {
- // The host components will be statically linked with the app-host: https://github.com/dotnet/runtime/issues/32823
- // Once this work is completed, an outdated hostfxr can only be found for framework-related apps.
- trace::error(_X("The required library %s does not support single-file apps."), fxr_path.c_str());
- need_newer_framework_error();
- rc = StatusCode::FrameworkMissingFailure;
- }
- }
- else
-#endif // defined(FEATURE_APPHOST)
+ hostfxr_main_startupinfo_fn main_fn_v2 = reinterpret_cast<hostfxr_main_startupinfo_fn>(pal::get_symbol(fxr, "hostfxr_main_startupinfo"));
+ if (main_fn_v2 != nullptr)
{
- hostfxr_main_startupinfo_fn hostfxr_main_startupinfo = reinterpret_cast<hostfxr_main_startupinfo_fn>(pal::get_symbol(fxr, "hostfxr_main_startupinfo"));
- if (hostfxr_main_startupinfo != nullptr)
- {
- const pal::char_t* host_path_cstr = host_path.c_str();
- const pal::char_t* dotnet_root_cstr = dotnet_root.empty() ? nullptr : dotnet_root.c_str();
- const pal::char_t* app_path_cstr = app_path.empty() ? nullptr : app_path.c_str();
+ const pal::char_t* host_path_cstr = host_path.c_str();
+ const pal::char_t* dotnet_root_cstr = dotnet_root.empty() ? nullptr : dotnet_root.c_str();
+ const pal::char_t* app_path_cstr = app_path.empty() ? nullptr : app_path.c_str();
- trace::info(_X("Invoking fx resolver [%s] hostfxr_main_startupinfo"), fxr_path.c_str());
- trace::info(_X("Host path: [%s]"), host_path.c_str());
- trace::info(_X("Dotnet path: [%s]"), dotnet_root.c_str());
- trace::info(_X("App path: [%s]"), app_path.c_str());
+ trace::info(_X("Invoking fx resolver [%s] v2"), fxr_path.c_str());
+ trace::info(_X("Host path: [%s]"), host_path.c_str());
+ trace::info(_X("Dotnet path: [%s]"), dotnet_root.c_str());
+ trace::info(_X("App path: [%s]"), app_path.c_str());
- hostfxr_set_error_writer_fn set_error_writer_fn = reinterpret_cast<hostfxr_set_error_writer_fn>(pal::get_symbol(fxr, "hostfxr_set_error_writer"));
+ hostfxr_set_error_writer_fn set_error_writer_fn = reinterpret_cast<hostfxr_set_error_writer_fn>(pal::get_symbol(fxr, "hostfxr_set_error_writer"));
+ {
propagate_error_writer_t propagate_error_writer_to_hostfxr(set_error_writer_fn);
- rc = hostfxr_main_startupinfo(argc, argv, host_path_cstr, dotnet_root_cstr, app_path_cstr);
+ rc = main_fn_v2(argc, argv, host_path_cstr, dotnet_root_cstr, app_path_cstr);
- // This check exists to provide an error message for UI apps when running 3.0 apps on 2.0 only hostfxr, which doesn't support error writer redirection.
if (trace::get_error_writer() != nullptr && rc == static_cast<int>(StatusCode::FrameworkMissingFailure) && !set_error_writer_fn)
{
- need_newer_framework_error();
+ pal::string_t url = get_download_url();
+ trace::error(_X(" _ To run this application, you need to install a newer version of .NET."));
+ trace::error(_X(""));
+ trace::error(_X(" - %s"), url.c_str());
}
}
+ }
+ else
+ {
+ if (requires_v2_hostfxr_interface)
+ {
+ trace::error(_X("The required library %s does not support relative app dll paths."), fxr_path.c_str());
+ rc = StatusCode::CoreHostEntryPointFailure;
+ }
else
{
- if (requires_hostfxr_startupinfo_interface)
+ trace::info(_X("Invoking fx resolver [%s] v1"), fxr_path.c_str());
+
+ // Previous corehost trace messages must be printed before calling trace::setup in hostfxr
+ trace::flush();
+
+ // For compat, use the v1 interface. This requires additional file I\O to re-parse parameters and
+ // for apphost, does not support DOTNET_ROOT or dll with different name for exe.
+ hostfxr_main_fn main_fn_v1 = reinterpret_cast<hostfxr_main_fn>(pal::get_symbol(fxr, "hostfxr_main"));
+ if (main_fn_v1 != nullptr)
{
- trace::error(_X("The required library %s does not support relative app dll paths."), fxr_path.c_str());
- rc = StatusCode::CoreHostEntryPointFailure;
+ rc = main_fn_v1(argc, argv);
}
else
{
- trace::info(_X("Invoking fx resolver [%s] v1"), fxr_path.c_str());
-
- // Previous corehost trace messages must be printed before calling trace::setup in hostfxr
- trace::flush();
-
- // For compat, use the v1 interface. This requires additional file I\O to re-parse parameters and
- // for apphost, does not support DOTNET_ROOT or dll with different name for exe.
- hostfxr_main_fn main_fn_v1 = reinterpret_cast<hostfxr_main_fn>(pal::get_symbol(fxr, "hostfxr_main"));
- if (main_fn_v1 != nullptr)
- {
- rc = main_fn_v1(argc, argv);
- }
- else
- {
- trace::error(_X("The required library %s does not contain the expected entry point."), fxr_path.c_str());
- rc = StatusCode::CoreHostEntryPointFailure;
- }
+ trace::error(_X("The required library %s does not contain the expected entry point."), fxr_path.c_str());
+ rc = StatusCode::CoreHostEntryPointFailure;
}
}
}