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:
authorSwaroop Sridhar <Swaroop.Sridhar@microsoft.com>2020-05-01 19:24:13 +0300
committerGitHub <noreply@github.com>2020-05-01 19:24:13 +0300
commit47ec733ba79b196e4e09d0c89bad245155002353 (patch)
tree98fc7124abbcb678abe9687e757a77e638560f05 /src/installer/corehost/corehost.cpp
parent6d1f7e01d3429054ec3dcb7c75b3450b9fe1429e (diff)
[release/5.0-preview4] Revert processing bundles in framework (#35679)v5.0.0-preview.4.20251.6
This commit reverts: Revert "Single-File: Process bundles in the framework (#34274)" This reverts commit 78b303df8fbb242985d049a277d0d199cafd51b5. Revert "Single-File Bundler: Add a FileSize test (#35149)" This reverts commit 779588a509b81d909ac5d496c172949ec1f1ddcc. *Customer Scenario* Publishing apps as a self-contained single-file doesn't work as expected. * Publish needs to generate hostpolicy and hostfxr separate from the single file bundle * Cross-platform publishing is incorrect *Problem* Since Static-apphost is not yet ready, processing bundle content in hostpolicy means that hostpolicy and hostfxr DLLs need to be separate from the bundle. This causes self-contained single-file apps to not be a "single file" temporarily. The change also requires supporting changes from the SDK, to publish hostfxr and hostpolicy as separate files, and to invoke HostModel library with arguments that facilitate cross-platform publishing. *Solution* To solve these, problem, this change reverts: Revert "Single-File: Process bundles in the framework (#34274)" commit 78b303df8fbb242985d049a277d0d199cafd51b5. and a dependent test-only change: Revert "Single-File Bundler: Add a FileSize test (#35149)" commit 779588a509b81d909ac5d496c172949ec1f1ddcc. *Risk* Medium The change is contained to only host components: apphost, hostpolicy, and hostfxr. However, the change is big, and needs testing in runtime and SDK repos. *Testing* Manually tested the SDK by inserting apphost, hostfxr, hostpolicy, and hostmodel library from this build into the `dotnet/packs` preview-4 SDK from https://github.com/dotnet/sdk/pull/11518 build. Verified that: * Singlefile apps can be published and run OK for { Windows, Linux, Osx } x {netcoreapp3.0, netcoreapp3.1, netcoreapp5.0} * Cross-targeting builds of single-file apps build and run OK (ex: built on Windos, run on Mac).
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;
}
}
}