From 6a250d492702476df15a4345e201ba1cdf79269c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Thu, 14 Apr 2022 02:24:36 +0200 Subject: [PATCH] DotNet hosting test --- BeefSpace.toml | 4 +- GlitchyEditor/BeefProj.toml | 1 - GlitchyEditor/src/Editor.bf | 9 + GlitchyEngineHelper/BeefProj.toml | 4 +- GlitchyEngineHelper/CMakeLists.txt | 37 +- GlitchyEngineHelper/DotNetRuntime.cpp | 251 ++++++++++++++ GlitchyEngineHelper/DotNetRuntime.h | 3 + GlitchyEngineHelper/GlitchyEngineHelper.cpp | 2 + GlitchyEngineHelper/GlitchyEngineHelper.h | 3 - GlitchyEngineHelper/src/DotNetRuntime.bf | 13 + .../vendor/dotnethost/coreclr_delegates.h | 47 +++ .../vendor/dotnethost/hostfxr.h | 323 ++++++++++++++++++ .../vendor/dotnethost/license.txt | 23 ++ .../vendor/dotnethost/nethost.dll | Bin 0 -> 139416 bytes .../vendor/dotnethost/nethost.h | 99 ++++++ .../vendor/dotnethost/nethost.lib | Bin 0 -> 1742 bytes 16 files changed, 806 insertions(+), 13 deletions(-) create mode 100644 GlitchyEngineHelper/DotNetRuntime.cpp create mode 100644 GlitchyEngineHelper/DotNetRuntime.h create mode 100644 GlitchyEngineHelper/src/DotNetRuntime.bf create mode 100644 GlitchyEngineHelper/vendor/dotnethost/coreclr_delegates.h create mode 100644 GlitchyEngineHelper/vendor/dotnethost/hostfxr.h create mode 100644 GlitchyEngineHelper/vendor/dotnethost/license.txt create mode 100644 GlitchyEngineHelper/vendor/dotnethost/nethost.dll create mode 100644 GlitchyEngineHelper/vendor/dotnethost/nethost.h create mode 100644 GlitchyEngineHelper/vendor/dotnethost/nethost.lib diff --git a/BeefSpace.toml b/BeefSpace.toml index e243759..9b79ee0 100644 --- a/BeefSpace.toml +++ b/BeefSpace.toml @@ -1,6 +1,6 @@ FileVersion = 1 -Projects = {Sandbox = {Path = "Sandbox"}, GlitchyEngine = {Path = "GlitchyEngine"}, GlitchLog = {Path = "GlitchLog"}, DirectX = {Path = "GlitchyEngine/vendor/directx/DirectX"}, DirectXTK = {Path = "GlitchyEngine/vendor/DirectXTK/DirectXTK-beef"}, LodePng = {Path = "vendor/lodepng-beef/lodepng-beef"}, FreeType = {Path = "GlitchyEngine/vendor/freetype"}, cgltf-beef = {Path = "GlitchyEngine/vendor/gltf/cgltf-beef"}, GlitchyEditor = {Path = "GlitchyEditor"}, msdfgen-beef = {Path = "GlitchyEngine/vendor/msdfgen/msdfgen-beef"}, ImGui = {Path = "GlitchyEngine/vendor/imgui/ImGui"}, ImGuiImplDX11 = {Path = "GlitchyEngine/vendor/imgui/ImGuiImplDX11"}, ImGuiImplWin32 = {Path = "GlitchyEngine/vendor/imgui/ImGuiImplWin32"}, ImGuizmo = {Path = "GlitchyEngine/vendor/imgui/ImGuizmo"}, GlitchyEngineHelper = {Path = "GlitchyEngineHelper"}, bon = {Path = "GlitchyEngine/vendor/bon"}} -WorkspaceFolders = {GlitchyEngine = ["GlitchyEngine", "GlitchLog", "GlitchyEngineHelper"], "GlitchyEngine/Dependencies" = ["cgltf-beef", "DirectX", "DirectXTK", "FreeType", "ImGui", "ImGuiImplDX11", "ImGuiImplWin32", "ImGuizmo", "LodePng", "msdfgen-beef", "bon"]} +Projects = {Sandbox = {Path = "Sandbox"}, GlitchyEngine = {Path = "GlitchyEngine"}, GlitchLog = {Path = "GlitchLog"}, DirectX = {Path = "GlitchyEngine/vendor/directx/DirectX"}, LodePng = {Path = "vendor/lodepng-beef/lodepng-beef"}, FreeType = {Path = "GlitchyEngine/vendor/freetype"}, cgltf-beef = {Path = "GlitchyEngine/vendor/gltf/cgltf-beef"}, GlitchyEditor = {Path = "GlitchyEditor"}, msdfgen-beef = {Path = "GlitchyEngine/vendor/msdfgen/msdfgen-beef"}, ImGui = {Path = "GlitchyEngine/vendor/imgui/ImGui"}, ImGuiImplDX11 = {Path = "GlitchyEngine/vendor/imgui/ImGuiImplDX11"}, ImGuiImplWin32 = {Path = "GlitchyEngine/vendor/imgui/ImGuiImplWin32"}, ImGuizmo = {Path = "GlitchyEngine/vendor/imgui/ImGuizmo"}, GlitchyEngineHelper = {Path = "GlitchyEngineHelper"}, bon = {Path = "GlitchyEngine/vendor/bon"}} +WorkspaceFolders = {GlitchyEngine = ["GlitchyEngine", "GlitchLog", "GlitchyEngineHelper"], "GlitchyEngine/Dependencies" = ["cgltf-beef", "DirectX", "FreeType", "ImGui", "ImGuiImplDX11", "ImGuiImplWin32", "ImGuizmo", "LodePng", "msdfgen-beef", "bon"]} [Workspace] StartupProject = "GlitchyEditor" diff --git a/GlitchyEditor/BeefProj.toml b/GlitchyEditor/BeefProj.toml index 964e7e5..b88c96e 100644 --- a/GlitchyEditor/BeefProj.toml +++ b/GlitchyEditor/BeefProj.toml @@ -3,5 +3,4 @@ Dependencies = {corlib = "*", GlitchLog = "*", GlitchyEngine = "*"} [Project] Name = "GlitchyEditor" -TargetType = "BeefGUIApplication" StartupObject = "GlitchyEngine.Program" diff --git a/GlitchyEditor/src/Editor.bf b/GlitchyEditor/src/Editor.bf index 27027ca..e9ad866 100644 --- a/GlitchyEditor/src/Editor.bf +++ b/GlitchyEditor/src/Editor.bf @@ -4,6 +4,7 @@ using System; using System.Collections; using GlitchyEngine.Collections; using GlitchyEditor.EditWindows; +using GlitchyEngineHelper; namespace GlitchyEditor { @@ -29,6 +30,14 @@ namespace GlitchyEditor /// Creates a new editor for the given world public this(Scene scene) { + String str = @"D:\Development\Projects\Beef\GlitchyEngine\build\Debug_Win64\GlitchyEditor\"; + + char16* ptr = str.ToScopedNativeWChar!(); + + DotNetRuntime.Init(); + + DotNetRuntime.TestRunDotNet(1, &ptr); + _scene = scene; _ecsWorld = _scene.[Friend]_ecsWorld; diff --git a/GlitchyEngineHelper/BeefProj.toml b/GlitchyEngineHelper/BeefProj.toml index 1f97ac5..8c18bb1 100644 --- a/GlitchyEngineHelper/BeefProj.toml +++ b/GlitchyEngineHelper/BeefProj.toml @@ -9,5 +9,5 @@ StartupObject = "GlitchyEngineHelper.Program" [Configs.Debug.Win64] BuildCommandsOnCompile = "IfFilesChanged" BuildCommandsOnRun = "IfFilesChanged" -LibPaths = ["$(ProjectDir)/out/build/x64-debug/GlitchyEngineHelper.lib"] -PostBuildCmds = ["$(ProjectDir)\\..\\bin\\vscmake.bat x64 $(ProjectDir) x64-debug"] +LibPaths = ["$(ProjectDir)/out/build/x64-debug/GlitchyEngineHelper.lib", "D:\\Development\\Projects\\Beef\\GlitchyEngine\\GlitchyEngineHelper\\vendor\\dotnethost\\nethost.lib"] +PreBuildCmds = ["$(ProjectDir)\\..\\bin\\vscmake.bat x64 $(ProjectDir) x64-debug", "CopyToDependents(\"$(ProjectDir)/out/build/x64-debug/*.dll\")"] diff --git a/GlitchyEngineHelper/CMakeLists.txt b/GlitchyEngineHelper/CMakeLists.txt index decfff2..5478f04 100644 --- a/GlitchyEngineHelper/CMakeLists.txt +++ b/GlitchyEngineHelper/CMakeLists.txt @@ -5,11 +5,38 @@ cmake_minimum_required (VERSION 3.15) project ("GlitchyEngineHelper") -# Add source to this project's executable. -add_library (GlitchyEngineHelper "GlitchyEngineHelper.cpp" "GlitchyEngineHelper.h" "vendor/xxHash/xxhash.c" "vendor/xxHash/xxhash.h" "vendor/DirectXTK/Src/DDSTextureLoader.cpp") +# Nethost: -include_directories("vendor/DirectXTK/Inc") +# Directory where the files for hosting a dotnet enviroment are located +SET(DOTNET_HOST_DIR "vendor/dotnethost") + +# todo: Find out how to handle this on other platforms +# target_link_libraries(GlitchyEngineHelper "vendor/dotnethost/nethost.lib") + +add_library(NetHost OBJECT IMPORTED) +set_target_properties(NetHost PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/vendor/dotnethost/nethost.lib) +set_property(TARGET NetHost PROPERTY IMPORTED_OBJECTS ${CMAKE_SOURCE_DIR}/vendor/dotnethost/nethost.lib) + +# Copy nethost.dll to output directory +configure_file("${DOTNET_HOST_DIR}/nethost.dll" "${CMAKE_CURRENT_BINARY_DIR}/nethost.dll" COPYONLY) + +# GlitchyEngineHelper: + +# Add source to this project's executable. +add_library (GlitchyEngineHelper STATIC + "GlitchyEngineHelper.cpp" "GlitchyEngineHelper.h" "vendor/xxHash/xxhash.c" "vendor/xxHash/xxhash.h" "vendor/DirectXTK/Src/DDSTextureLoader.cpp" "DotNetRuntime.h" "DotNetRuntime.cpp" + # Link object files from nethost into library (kinda dirty I think, but avoids linking to nethost.lib when compiling in beef) + $ +) + +target_include_directories(GlitchyEngineHelper PRIVATE + "vendor/DirectXTK/Inc" + ${DOTNET_HOST_DIR} +) + +IF (WIN32) + add_compile_definitions(WINDOWS) +ENDIF() # Use statically linked multithreaded MSVC runtime -set_property(TARGET GlitchyEngineHelper PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreadedDebug") -#$<$:Debug> \ No newline at end of file +set_property(TARGET GlitchyEngineHelper PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") \ No newline at end of file diff --git a/GlitchyEngineHelper/DotNetRuntime.cpp b/GlitchyEngineHelper/DotNetRuntime.cpp new file mode 100644 index 0000000..86cd76e --- /dev/null +++ b/GlitchyEngineHelper/DotNetRuntime.cpp @@ -0,0 +1,251 @@ +#include "DotNetRuntime.h" + +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +// https://docs.microsoft.com/en-us/dotnet/core/tutorials/netcore-hosting + +// Standard headers +#include +#include +#include +#include +#include +#include + +// Provided by the AppHost NuGet package and installed as an SDK pack +#include + +// Header files copied from https://github.com/dotnet/core-setup +#include +#include + +#ifdef WINDOWS +#include + +#define STR(s) L ## s +#define CH(c) L ## c +#define DIR_SEPARATOR L'\\' + +#else +#include +#include + +#define STR(s) s +#define CH(c) c +#define DIR_SEPARATOR '/' +#define MAX_PATH PATH_MAX + +#endif + +using string_t = std::basic_string; + +namespace +{ + // Globals to hold hostfxr exports + hostfxr_initialize_for_runtime_config_fn init_fptr; + hostfxr_get_runtime_delegate_fn get_delegate_fptr; + hostfxr_close_fn close_fptr; + + // Forward declarations + bool load_hostfxr(); + load_assembly_and_get_function_pointer_fn get_dotnet_load_assembly(const char_t* assembly); +} + +GE_EXPORT int GE_CALLTYPE DotNet_Init() +{ + if (!load_hostfxr()) + { + assert(false && "Failure: load_hostfxr()"); + return EXIT_FAILURE; + } + + return 0; +} + +GE_EXPORT int GE_CALLTYPE TestRunDotNet(int argc, wchar_t* argv[]) +{ + // Get the current executable's directory + // This sample assumes the managed assembly to load and its runtime configuration file are next to the host + char_t host_path[MAX_PATH]; +#if WINDOWS + auto size = ::GetFullPathNameW(argv[0], sizeof(host_path) / sizeof(char_t), host_path, nullptr); + assert(size != 0); +#else + auto resolved = realpath(argv[0], host_path); + assert(resolved != nullptr); +#endif + + string_t root_path = host_path; + auto pos = root_path.find_last_of(DIR_SEPARATOR); + assert(pos != string_t::npos); + root_path = root_path.substr(0, pos + 1); + + //// + //// STEP 1: Load HostFxr and get exported hosting functions + //// + //if (!load_hostfxr()) + //{ + // assert(false && "Failure: load_hostfxr()"); + // return EXIT_FAILURE; + //} + + // + // STEP 2: Initialize and start the .NET Core runtime + // + const string_t config_path = root_path + STR("DotNetTest.runtimeconfig.json"); + load_assembly_and_get_function_pointer_fn load_assembly_and_get_function_pointer = nullptr; + load_assembly_and_get_function_pointer = get_dotnet_load_assembly(config_path.c_str()); + assert(load_assembly_and_get_function_pointer != nullptr && "Failure: get_dotnet_load_assembly()"); + + // + // STEP 3: Load managed assembly and get function pointer to a managed method + // + const string_t dotnetlib_path = root_path + STR("DotNetTest.dll"); + const char_t* dotnet_type = STR("DotNetTest.Lib, DotNetTest"); + const char_t* dotnet_type_method = STR("Hello"); + // + // Function pointer to managed delegate + component_entry_point_fn hello = nullptr; + int rc = load_assembly_and_get_function_pointer( + dotnetlib_path.c_str(), + dotnet_type, + dotnet_type_method, + nullptr /*delegate_type_name*/, + nullptr, + (void**)&hello); + // + assert(rc == 0 && hello != nullptr && "Failure: load_assembly_and_get_function_pointer()"); + + // + // STEP 4: Run managed code + // + struct lib_args + { + const char_t* message; + int number; + }; + for (int i = 0; i < 3; ++i) + { + // + lib_args args + { + STR("from host!"), + i + }; + + hello(&args, sizeof(args)); + // + } + + // Function pointer to managed delegate with non-default signature + typedef void (CORECLR_DELEGATE_CALLTYPE* custom_entry_point_fn)(lib_args args); + custom_entry_point_fn custom = nullptr; + rc = load_assembly_and_get_function_pointer( + dotnetlib_path.c_str(), + dotnet_type, + STR("CustomEntryPointUnmanaged") /*method_name*/, + UNMANAGEDCALLERSONLY_METHOD, + nullptr, + (void**)&custom); + assert(rc == 0 && custom != nullptr && "Failure: load_assembly_and_get_function_pointer()"); + + lib_args args + { + STR("from host!"), + -1 + }; + custom(args); + + return EXIT_SUCCESS; +} + +/******************************************************************************************** + * Function used to load and activate .NET Core + ********************************************************************************************/ + +namespace +{ + // Forward declarations + void* load_library(const char_t*); + void* get_export(void*, const char*); + +#ifdef WINDOWS + void* load_library(const char_t* path) + { + std::cout << "Loading library: " << path << std::endl; + HMODULE h = ::LoadLibraryW(path); + assert(h != nullptr); + return (void*)h; + } + void* get_export(void* h, const char* name) + { + void* f = ::GetProcAddress((HMODULE)h, name); + assert(f != nullptr); + return f; + } +#else + void* load_library(const char_t* path) + { + void* h = dlopen(path, RTLD_LAZY | RTLD_LOCAL); + assert(h != nullptr); + return h; + } + void* get_export(void* h, const char* name) + { + void* f = dlsym(h, name); + assert(f != nullptr); + return f; + } +#endif + + // + // Using the nethost library, discover the location of hostfxr and get exports + bool load_hostfxr() + { + // Pre-allocate a large buffer for the path to hostfxr + char_t buffer[MAX_PATH]; + size_t buffer_size = sizeof(buffer) / sizeof(char_t); + int rc = get_hostfxr_path(buffer, &buffer_size, nullptr); + if (rc != 0) + return false; + + // Load hostfxr and get desired exports + void* lib = load_library(buffer); + init_fptr = (hostfxr_initialize_for_runtime_config_fn)get_export(lib, "hostfxr_initialize_for_runtime_config"); + get_delegate_fptr = (hostfxr_get_runtime_delegate_fn)get_export(lib, "hostfxr_get_runtime_delegate"); + close_fptr = (hostfxr_close_fn)get_export(lib, "hostfxr_close"); + + return (init_fptr && get_delegate_fptr && close_fptr); + } + // + + // + // Load and initialize .NET Core and get desired function pointer for scenario + load_assembly_and_get_function_pointer_fn get_dotnet_load_assembly(const char_t* config_path) + { + // Load .NET Core + void* load_assembly_and_get_function_pointer = nullptr; + hostfxr_handle cxt = nullptr; + int rc = init_fptr(config_path, nullptr, &cxt); + if (rc != 0 || cxt == nullptr) + { + std::cerr << "Init failed: " << std::hex << std::showbase << rc << std::endl; + close_fptr(cxt); + return nullptr; + } + + // Get the load assembly function pointer + rc = get_delegate_fptr( + cxt, + hdt_load_assembly_and_get_function_pointer, + &load_assembly_and_get_function_pointer); + if (rc != 0 || load_assembly_and_get_function_pointer == nullptr) + std::cerr << "Get delegate failed: " << std::hex << std::showbase << rc << std::endl; + + close_fptr(cxt); + return (load_assembly_and_get_function_pointer_fn)load_assembly_and_get_function_pointer; + } + // +} diff --git a/GlitchyEngineHelper/DotNetRuntime.h b/GlitchyEngineHelper/DotNetRuntime.h new file mode 100644 index 0000000..eda0f37 --- /dev/null +++ b/GlitchyEngineHelper/DotNetRuntime.h @@ -0,0 +1,3 @@ +#pragma once + +#include "GlitchyEngineHelper.h" diff --git a/GlitchyEngineHelper/GlitchyEngineHelper.cpp b/GlitchyEngineHelper/GlitchyEngineHelper.cpp index f59bf79..c89adf6 100644 --- a/GlitchyEngineHelper/GlitchyEngineHelper.cpp +++ b/GlitchyEngineHelper/GlitchyEngineHelper.cpp @@ -2,6 +2,8 @@ // #include "GlitchyEngineHelper.h" +#include "vendor/xxHash/xxhash.h" +#include "vendor/DirectXTK/Inc/DDSTextureLoader.h" using namespace std; diff --git a/GlitchyEngineHelper/GlitchyEngineHelper.h b/GlitchyEngineHelper/GlitchyEngineHelper.h index ca90f7d..1c095f9 100644 --- a/GlitchyEngineHelper/GlitchyEngineHelper.h +++ b/GlitchyEngineHelper/GlitchyEngineHelper.h @@ -5,6 +5,3 @@ #define GE_EXPORT extern "C" __declspec(dllexport) #define GE_CALLTYPE __cdecl - -#include "vendor/xxHash/xxhash.h" -#include "vendor/DirectXTK/Inc/DDSTextureLoader.h" diff --git a/GlitchyEngineHelper/src/DotNetRuntime.bf b/GlitchyEngineHelper/src/DotNetRuntime.bf new file mode 100644 index 0000000..839acf8 --- /dev/null +++ b/GlitchyEngineHelper/src/DotNetRuntime.bf @@ -0,0 +1,13 @@ +using System; +using System.Interop; +namespace GlitchyEngineHelper +{ + static class DotNetRuntime + { + [LinkName("TestRunDotNet"), CallingConvention(.Cdecl)] + public static extern int TestRunDotNet(c_int argc, c_wchar** argv); + + [LinkName("DotNet_Init"), CallingConvention(.Cdecl)] + public static extern int Init(); + } +} \ No newline at end of file diff --git a/GlitchyEngineHelper/vendor/dotnethost/coreclr_delegates.h b/GlitchyEngineHelper/vendor/dotnethost/coreclr_delegates.h new file mode 100644 index 0000000..914ab59 --- /dev/null +++ b/GlitchyEngineHelper/vendor/dotnethost/coreclr_delegates.h @@ -0,0 +1,47 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#ifndef __CORECLR_DELEGATES_H__ +#define __CORECLR_DELEGATES_H__ + +#include + +#if defined(_WIN32) + #define CORECLR_DELEGATE_CALLTYPE __stdcall + #ifdef _WCHAR_T_DEFINED + typedef wchar_t char_t; + #else + typedef unsigned short char_t; + #endif +#else + #define CORECLR_DELEGATE_CALLTYPE + typedef char char_t; +#endif + +#define UNMANAGEDCALLERSONLY_METHOD ((const char_t*)-1) + +// Signature of delegate returned by coreclr_delegate_type::load_assembly_and_get_function_pointer +typedef int (CORECLR_DELEGATE_CALLTYPE *load_assembly_and_get_function_pointer_fn)( + const char_t *assembly_path /* Fully qualified path to assembly */, + const char_t *type_name /* Assembly qualified type name */, + const char_t *method_name /* Public static method name compatible with delegateType */, + const char_t *delegate_type_name /* Assembly qualified delegate type name or null + or UNMANAGEDCALLERSONLY_METHOD if the method is marked with + the UnmanagedCallersOnlyAttribute. */, + void *reserved /* Extensibility parameter (currently unused and must be 0) */, + /*out*/ void **delegate /* Pointer where to store the function pointer result */); + +// Signature of delegate returned by load_assembly_and_get_function_pointer_fn when delegate_type_name == null (default) +typedef int (CORECLR_DELEGATE_CALLTYPE *component_entry_point_fn)(void *arg, int32_t arg_size_in_bytes); + +typedef int (CORECLR_DELEGATE_CALLTYPE *get_function_pointer_fn)( + const char_t *type_name /* Assembly qualified type name */, + const char_t *method_name /* Public static method name compatible with delegateType */, + const char_t *delegate_type_name /* Assembly qualified delegate type name or null, + or UNMANAGEDCALLERSONLY_METHOD if the method is marked with + the UnmanagedCallersOnlyAttribute. */, + void *load_context /* Extensibility parameter (currently unused and must be 0) */, + void *reserved /* Extensibility parameter (currently unused and must be 0) */, + /*out*/ void **delegate /* Pointer where to store the function pointer result */); + +#endif // __CORECLR_DELEGATES_H__ diff --git a/GlitchyEngineHelper/vendor/dotnethost/hostfxr.h b/GlitchyEngineHelper/vendor/dotnethost/hostfxr.h new file mode 100644 index 0000000..49afae3 --- /dev/null +++ b/GlitchyEngineHelper/vendor/dotnethost/hostfxr.h @@ -0,0 +1,323 @@ +// 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 +#include + +#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 occure 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 hostfxr_dotnet_environment_sdk_info* sdks; + + size_t framework_count; + const hostfxr_dotnet_environment_framework_info* frameworks; +}; + +#endif //__HOSTFXR_H__ diff --git a/GlitchyEngineHelper/vendor/dotnethost/license.txt b/GlitchyEngineHelper/vendor/dotnethost/license.txt new file mode 100644 index 0000000..984713a --- /dev/null +++ b/GlitchyEngineHelper/vendor/dotnethost/license.txt @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/GlitchyEngineHelper/vendor/dotnethost/nethost.dll b/GlitchyEngineHelper/vendor/dotnethost/nethost.dll new file mode 100644 index 0000000000000000000000000000000000000000..6f67abdd0e0e6ecf909d3b7601c3fdc7548e7849 GIT binary patch literal 139416 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 Q$MWaOMv})i`@{qR02a-|WdHyG literal 0 HcmV?d00001 diff --git a/GlitchyEngineHelper/vendor/dotnethost/nethost.h b/GlitchyEngineHelper/vendor/dotnethost/nethost.h new file mode 100644 index 0000000..31adde5 --- /dev/null +++ b/GlitchyEngineHelper/vendor/dotnethost/nethost.h @@ -0,0 +1,99 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#ifndef __NETHOST_H__ +#define __NETHOST_H__ + +#include + +#ifdef _WIN32 + #ifdef NETHOST_EXPORT + #define NETHOST_API __declspec(dllexport) + #else + // Consuming the nethost as a static library + // Shouldn't export attempt to dllimport. + #ifdef NETHOST_USE_AS_STATIC + #define NETHOST_API + #else + #define NETHOST_API __declspec(dllimport) + #endif + #endif + + #define NETHOST_CALLTYPE __stdcall + #ifdef _WCHAR_T_DEFINED + typedef wchar_t char_t; + #else + typedef unsigned short char_t; + #endif +#else + #ifdef NETHOST_EXPORT + #define NETHOST_API __attribute__((__visibility__("default"))) + #else + #define NETHOST_API + #endif + + #define NETHOST_CALLTYPE + typedef char char_t; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// Parameters for get_hostfxr_path +// +// Fields: +// size +// Size of the struct. This is used for versioning. +// +// assembly_path +// Path to the compenent's assembly. +// If specified, hostfxr is located as if the assembly_path is the apphost +// +// dotnet_root +// Path to directory containing the dotnet executable. +// If specified, hostfxr is located as if an application is started using +// 'dotnet app.dll', which means it will be searched for under the dotnet_root +// path and the assembly_path is ignored. +// +struct get_hostfxr_parameters { + size_t size; + const char_t *assembly_path; + const char_t *dotnet_root; +}; + +// +// Get the path to the hostfxr library +// +// Parameters: +// buffer +// Buffer that will be populated with the hostfxr path, including a null terminator. +// +// buffer_size +// [in] Size of buffer in char_t units. +// [out] Size of buffer used in char_t units. If the input value is too small +// or buffer is nullptr, this is populated with the minimum required size +// in char_t units for a buffer to hold the hostfxr path +// +// get_hostfxr_parameters +// Optional. Parameters that modify the behaviour for locating the hostfxr library. +// If nullptr, hostfxr is located using the enviroment variable or global registration +// +// Return value: +// 0 on success, otherwise failure +// 0x80008098 - buffer is too small (HostApiBufferTooSmall) +// +// Remarks: +// The full search for the hostfxr library is done on every call. To minimize the need +// to call this function multiple times, pass a large buffer (e.g. PATH_MAX). +// +NETHOST_API int NETHOST_CALLTYPE get_hostfxr_path( + char_t * buffer, + size_t * buffer_size, + const struct get_hostfxr_parameters *parameters); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // __NETHOST_H__ diff --git a/GlitchyEngineHelper/vendor/dotnethost/nethost.lib b/GlitchyEngineHelper/vendor/dotnethost/nethost.lib new file mode 100644 index 0000000000000000000000000000000000000000..5b5a41b3520370f6971e5c89130dd139c10f5bcd GIT binary patch literal 1742 zcmcIlPfrs;6#s1(K^9{g;3&yTNYsNB%9hZ?kS$_jLtDsF&ePg0vy?w<%x^g2pzKv@haQB;ZD%sQ z26!(mg8lrP?cBOpOXX8^qPkxfyJb)C3wGW$M7`)$(4!a{Nuq;fgrJ;gz?Dw^6Q%-T zAp#8%jL@T#7k9uksOx>P%b3L6y*(e^-?C#R7u(r!TRPl}FP|p}*L}jmBj%RhHh1T? z0trYF^Faxc+K8^ks&3IM&c)T%G%+7(ev=9c6Ku?1O1mYg#sgw*Xev9_+b}O9L?}tt&YP3jYN=5>tnGN_Q|FnPN$1w(eiz}(*b$zfBrzAIl@q5U zbPMcKZNE;wo;Nk^hWzWCAX7>)PX*Zqe0M8K^&K5*-ceO