mirror of
https://github.com/godotengine/godot
synced 2024-09-05 10:58:27 +00:00
![Ignacio Roldán Etcheverry](/assets/img/avatar_default.png)
We want to replace libnethost as it gives us issues with some compilers. Our implementation tries to mimic libnethost's hostfxr_resolver search logic. We try to use the same function names for easier comparing in case we need to update this in the future.
324 lines
11 KiB
C++
324 lines
11 KiB
C++
// Licensed to the .NET Foundation under one or more agreements.
|
|
// The .NET Foundation licenses this file to you under the MIT license.
|
|
|
|
#ifndef __HOSTFXR_H__
|
|
#define __HOSTFXR_H__
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#if defined(_WIN32)
|
|
#define HOSTFXR_CALLTYPE __cdecl
|
|
#ifdef _WCHAR_T_DEFINED
|
|
typedef wchar_t char_t;
|
|
#else
|
|
typedef unsigned short char_t;
|
|
#endif
|
|
#else
|
|
#define HOSTFXR_CALLTYPE
|
|
typedef char char_t;
|
|
#endif
|
|
|
|
enum hostfxr_delegate_type
|
|
{
|
|
hdt_com_activation,
|
|
hdt_load_in_memory_assembly,
|
|
hdt_winrt_activation,
|
|
hdt_com_register,
|
|
hdt_com_unregister,
|
|
hdt_load_assembly_and_get_function_pointer,
|
|
hdt_get_function_pointer,
|
|
};
|
|
|
|
typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_main_fn)(const int argc, const char_t **argv);
|
|
typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_main_startupinfo_fn)(
|
|
const int argc,
|
|
const char_t **argv,
|
|
const char_t *host_path,
|
|
const char_t *dotnet_root,
|
|
const char_t *app_path);
|
|
typedef int32_t(HOSTFXR_CALLTYPE* hostfxr_main_bundle_startupinfo_fn)(
|
|
const int argc,
|
|
const char_t** argv,
|
|
const char_t* host_path,
|
|
const char_t* dotnet_root,
|
|
const char_t* app_path,
|
|
int64_t bundle_header_offset);
|
|
|
|
typedef void(HOSTFXR_CALLTYPE *hostfxr_error_writer_fn)(const char_t *message);
|
|
|
|
//
|
|
// Sets a callback which is to be used to write errors to.
|
|
//
|
|
// Parameters:
|
|
// error_writer
|
|
// A callback function which will be invoked every time an error is to be reported.
|
|
// Or nullptr to unregister previously registered callback and return to the default behavior.
|
|
// Return value:
|
|
// The previously registered callback (which is now unregistered), or nullptr if no previous callback
|
|
// was registered
|
|
//
|
|
// The error writer is registered per-thread, so the registration is thread-local. On each thread
|
|
// only one callback can be registered. Subsequent registrations overwrite the previous ones.
|
|
//
|
|
// By default no callback is registered in which case the errors are written to stderr.
|
|
//
|
|
// Each call to the error writer is sort of like writing a single line (the EOL character is omitted).
|
|
// Multiple calls to the error writer may occur for one failure.
|
|
//
|
|
// If the hostfxr invokes functions in hostpolicy as part of its operation, the error writer
|
|
// will be propagated to hostpolicy for the duration of the call. This means that errors from
|
|
// both hostfxr and hostpolicy will be reporter through the same error writer.
|
|
//
|
|
typedef hostfxr_error_writer_fn(HOSTFXR_CALLTYPE *hostfxr_set_error_writer_fn)(hostfxr_error_writer_fn error_writer);
|
|
|
|
typedef void* hostfxr_handle;
|
|
struct hostfxr_initialize_parameters
|
|
{
|
|
size_t size;
|
|
const char_t *host_path;
|
|
const char_t *dotnet_root;
|
|
};
|
|
|
|
//
|
|
// Initializes the hosting components for a dotnet command line running an application
|
|
//
|
|
// Parameters:
|
|
// argc
|
|
// Number of argv arguments
|
|
// argv
|
|
// Command-line arguments for running an application (as if through the dotnet executable).
|
|
// Only command-line arguments which are accepted by runtime installation are supported, SDK/CLI commands are not supported.
|
|
// For example 'app.dll app_argument_1 app_argument_2`.
|
|
// parameters
|
|
// Optional. Additional parameters for initialization
|
|
// host_context_handle
|
|
// On success, this will be populated with an opaque value representing the initialized host context
|
|
//
|
|
// Return value:
|
|
// Success - Hosting components were successfully initialized
|
|
// HostInvalidState - Hosting components are already initialized
|
|
//
|
|
// This function parses the specified command-line arguments to determine the application to run. It will
|
|
// then find the corresponding .runtimeconfig.json and .deps.json with which to resolve frameworks and
|
|
// dependencies and prepare everything needed to load the runtime.
|
|
//
|
|
// This function only supports arguments for running an application. It does not support SDK commands.
|
|
//
|
|
// This function does not load the runtime.
|
|
//
|
|
typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_initialize_for_dotnet_command_line_fn)(
|
|
int argc,
|
|
const char_t **argv,
|
|
const struct hostfxr_initialize_parameters *parameters,
|
|
/*out*/ hostfxr_handle *host_context_handle);
|
|
|
|
//
|
|
// Initializes the hosting components using a .runtimeconfig.json file
|
|
//
|
|
// Parameters:
|
|
// runtime_config_path
|
|
// Path to the .runtimeconfig.json file
|
|
// parameters
|
|
// Optional. Additional parameters for initialization
|
|
// host_context_handle
|
|
// On success, this will be populated with an opaque value representing the initialized host context
|
|
//
|
|
// Return value:
|
|
// Success - Hosting components were successfully initialized
|
|
// Success_HostAlreadyInitialized - Config is compatible with already initialized hosting components
|
|
// Success_DifferentRuntimeProperties - Config has runtime properties that differ from already initialized hosting components
|
|
// CoreHostIncompatibleConfig - Config is incompatible with already initialized hosting components
|
|
//
|
|
// This function will process the .runtimeconfig.json to resolve frameworks and prepare everything needed
|
|
// to load the runtime. It will only process the .deps.json from frameworks (not any app/component that
|
|
// may be next to the .runtimeconfig.json).
|
|
//
|
|
// This function does not load the runtime.
|
|
//
|
|
// If called when the runtime has already been loaded, this function will check if the specified runtime
|
|
// config is compatible with the existing runtime.
|
|
//
|
|
// Both Success_HostAlreadyInitialized and Success_DifferentRuntimeProperties codes are considered successful
|
|
// initializations. In the case of Success_DifferentRuntimeProperties, it is left to the consumer to verify that
|
|
// the difference in properties is acceptable.
|
|
//
|
|
typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_initialize_for_runtime_config_fn)(
|
|
const char_t *runtime_config_path,
|
|
const struct hostfxr_initialize_parameters *parameters,
|
|
/*out*/ hostfxr_handle *host_context_handle);
|
|
|
|
//
|
|
// Gets the runtime property value for an initialized host context
|
|
//
|
|
// Parameters:
|
|
// host_context_handle
|
|
// Handle to the initialized host context
|
|
// name
|
|
// Runtime property name
|
|
// value
|
|
// Out parameter. Pointer to a buffer with the property value.
|
|
//
|
|
// Return value:
|
|
// The error code result.
|
|
//
|
|
// The buffer pointed to by value is owned by the host context. The lifetime of the buffer is only
|
|
// guaranteed until any of the below occur:
|
|
// - a 'run' method is called for the host context
|
|
// - properties are changed via hostfxr_set_runtime_property_value
|
|
// - the host context is closed via 'hostfxr_close'
|
|
//
|
|
// If host_context_handle is nullptr and an active host context exists, this function will get the
|
|
// property value for the active host context.
|
|
//
|
|
typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_get_runtime_property_value_fn)(
|
|
const hostfxr_handle host_context_handle,
|
|
const char_t *name,
|
|
/*out*/ const char_t **value);
|
|
|
|
//
|
|
// Sets the value of a runtime property for an initialized host context
|
|
//
|
|
// Parameters:
|
|
// host_context_handle
|
|
// Handle to the initialized host context
|
|
// name
|
|
// Runtime property name
|
|
// value
|
|
// Value to set
|
|
//
|
|
// Return value:
|
|
// The error code result.
|
|
//
|
|
// Setting properties is only supported for the first host context, before the runtime has been loaded.
|
|
//
|
|
// If the property already exists in the host context, it will be overwritten. If value is nullptr, the
|
|
// property will be removed.
|
|
//
|
|
typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_set_runtime_property_value_fn)(
|
|
const hostfxr_handle host_context_handle,
|
|
const char_t *name,
|
|
const char_t *value);
|
|
|
|
//
|
|
// Gets all the runtime properties for an initialized host context
|
|
//
|
|
// Parameters:
|
|
// host_context_handle
|
|
// Handle to the initialized host context
|
|
// count
|
|
// [in] Size of the keys and values buffers
|
|
// [out] Number of properties returned (size of keys/values buffers used). If the input value is too
|
|
// small or keys/values is nullptr, this is populated with the number of available properties
|
|
// keys
|
|
// Array of pointers to buffers with runtime property keys
|
|
// values
|
|
// Array of pointers to buffers with runtime property values
|
|
//
|
|
// Return value:
|
|
// The error code result.
|
|
//
|
|
// The buffers pointed to by keys and values are owned by the host context. The lifetime of the buffers is only
|
|
// guaranteed until any of the below occur:
|
|
// - a 'run' method is called for the host context
|
|
// - properties are changed via hostfxr_set_runtime_property_value
|
|
// - the host context is closed via 'hostfxr_close'
|
|
//
|
|
// If host_context_handle is nullptr and an active host context exists, this function will get the
|
|
// properties for the active host context.
|
|
//
|
|
typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_get_runtime_properties_fn)(
|
|
const hostfxr_handle host_context_handle,
|
|
/*inout*/ size_t * count,
|
|
/*out*/ const char_t **keys,
|
|
/*out*/ const char_t **values);
|
|
|
|
//
|
|
// Load CoreCLR and run the application for an initialized host context
|
|
//
|
|
// Parameters:
|
|
// host_context_handle
|
|
// Handle to the initialized host context
|
|
//
|
|
// Return value:
|
|
// If the app was successfully run, the exit code of the application. Otherwise, the error code result.
|
|
//
|
|
// The host_context_handle must have been initialized using hostfxr_initialize_for_dotnet_command_line.
|
|
//
|
|
// This function will not return until the managed application exits.
|
|
//
|
|
typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_run_app_fn)(const hostfxr_handle host_context_handle);
|
|
|
|
//
|
|
// Gets a typed delegate from the currently loaded CoreCLR or from a newly created one.
|
|
//
|
|
// Parameters:
|
|
// host_context_handle
|
|
// Handle to the initialized host context
|
|
// type
|
|
// Type of runtime delegate requested
|
|
// delegate
|
|
// An out parameter that will be assigned the delegate.
|
|
//
|
|
// Return value:
|
|
// The error code result.
|
|
//
|
|
// If the host_context_handle was initialized using hostfxr_initialize_for_runtime_config,
|
|
// then all delegate types are supported.
|
|
// If the host_context_handle was initialized using hostfxr_initialize_for_dotnet_command_line,
|
|
// then only the following delegate types are currently supported:
|
|
// hdt_load_assembly_and_get_function_pointer
|
|
// hdt_get_function_pointer
|
|
//
|
|
typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_get_runtime_delegate_fn)(
|
|
const hostfxr_handle host_context_handle,
|
|
enum hostfxr_delegate_type type,
|
|
/*out*/ void **delegate);
|
|
|
|
//
|
|
// Closes an initialized host context
|
|
//
|
|
// Parameters:
|
|
// host_context_handle
|
|
// Handle to the initialized host context
|
|
//
|
|
// Return value:
|
|
// The error code result.
|
|
//
|
|
typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_close_fn)(const hostfxr_handle host_context_handle);
|
|
|
|
struct hostfxr_dotnet_environment_sdk_info
|
|
{
|
|
size_t size;
|
|
const char_t* version;
|
|
const char_t* path;
|
|
};
|
|
|
|
typedef void(HOSTFXR_CALLTYPE* hostfxr_get_dotnet_environment_info_result_fn)(
|
|
const struct hostfxr_dotnet_environment_info* info,
|
|
void* result_context);
|
|
|
|
struct hostfxr_dotnet_environment_framework_info
|
|
{
|
|
size_t size;
|
|
const char_t* name;
|
|
const char_t* version;
|
|
const char_t* path;
|
|
};
|
|
|
|
struct hostfxr_dotnet_environment_info
|
|
{
|
|
size_t size;
|
|
|
|
const char_t* hostfxr_version;
|
|
const char_t* hostfxr_commit_hash;
|
|
|
|
size_t sdk_count;
|
|
const struct hostfxr_dotnet_environment_sdk_info* sdks;
|
|
|
|
size_t framework_count;
|
|
const struct hostfxr_dotnet_environment_framework_info* frameworks;
|
|
};
|
|
|
|
#endif //__HOSTFXR_H__
|