1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
#![warn(clippy::pedantic, clippy::cargo, unsafe_op_in_unsafe_fn)]
#![allow(
clippy::missing_safety_doc,
clippy::missing_errors_doc,
clippy::missing_panics_doc,
clippy::module_name_repetitions,
clippy::multiple_crate_versions,
clippy::doc_markdown,
non_camel_case_types,
dead_code
)]
#![cfg_attr(all(feature = "doc-cfg", nightly), feature(doc_cfg))]
/*!
FFI bindings for [hostfxr](https://github.com/dotnet/runtime/blob/main/docs/design/features/host-components.md#components-of-the-hosting).
## Related crates
- [nethost-sys](https://crates.io/crates/nethost-sys) - bindings for the nethost library.
- [coreclr-hosting-shared](https://crates.io/crates/coreclr-hosting-shared) - shared bindings between this crate and [nethost-sys](https://crates.io/crates/nethost-sys).
- [netcorehost](https://crates.io/crates/netcorehost) - rusty wrapper over the nethost and hostfxr libraries.
## Additional Information
- [Hosting layer APIs](https://github.com/dotnet/core-setup/blob/master/Documentation/design-docs/hosting-layer-apis.md)
- [Native hosting](https://github.com/dotnet/core-setup/blob/master/Documentation/design-docs/native-hosting.md#runtime-properties)
- [Write a custom .NET Core host to control the .NET runtime from your native code](https://docs.microsoft.com/en-us/dotnet/core/tutorials/netcore-hosting)
## License
Licensed under the MIT license ([LICENSE](https://github.com/OpenByteDev/hostfxr-sys/blob/master/LICENSE) or <http://opensource.org/licenses/MIT>)
*/
#[macro_use]
extern crate dlopen_derive;
pub use dlopen;
use core::{ffi::c_void, mem};
use coreclr_hosting_shared::{char_t, size_t};
/// Signifies that the target method is marked with the [`UnmanagedCallersOnlyAttribute`].
/// This means that the name alone can identify the target method.
///
/// [`UnmanagedCallersOnlyAttribute`]: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute
pub const UNMANAGED_CALLERS_ONLY_METHOD: *const char_t = usize::MAX as *const _;
/// Seperator char used to seperate a list of paths in a string.
#[cfg(windows)]
pub const PATH_LIST_SEPARATOR: char_t = b';' as char_t;
/// Seperator char used to seperate a list of paths in a string.
#[cfg(not(windows))]
pub const PATH_LIST_SEPARATOR: char_t = b':' as char_t;
#[repr(i32)]
pub enum hostfxr_delegate_type {
hdt_com_activation = 0,
hdt_load_in_memory_assembly = 1,
hdt_winrt_activation = 2,
hdt_com_register = 3,
hdt_com_unregister = 4,
hdt_load_assembly_and_get_function_pointer = 5,
hdt_get_function_pointer = 6,
}
/// Error reporting function signature.
pub type hostfxr_error_writer_fn = extern "C" fn(message: *const char_t);
#[allow(non_upper_case_globals)]
/// Flag constants for `hostfxr_resolve_sdk2`.
pub mod hostfxr_resolve_sdk2_flags_t {
pub const none: i32 = 0x0;
pub const disallow_prerelease: i32 = 0x1;
}
#[repr(i32)]
pub enum hostfxr_resolve_sdk2_result_key_t {
resolved_sdk_dir = 0,
global_json_path = 1,
}
/// Result callback signature for `hostfxr_resolve_sdk2`.
pub type hostfxr_resolve_sdk2_result_fn =
extern "C" fn(key: hostfxr_resolve_sdk2_result_key_t, value: *const char_t);
/// Result callback signature for `hostfxr_get_available_sdks`.
pub type hostfxr_get_available_sdks_result_fn =
extern "C" fn(sdk_count: i32, sdk_dirs: *const *const char_t);
/// Handle to a hostfxr context.
pub type hostfxr_handle = *const c_void;
/// Signature of delegate returned by [`hostfxr_get_runtime_delegate`] for type [`hdt_load_assembly_and_get_function_pointer`]
///
/// # Arguments
/// * `assembly_path`:
/// Fully qualified path to assembly
/// * `type_name`:
/// Assembly qualified type name
/// * `method_name`:
/// Public static method name compatible with delegateType
/// * `delegate_type_name`:
/// Assembly qualified delegate type name or [`null`](core::ptr::null()), or [`UNMANAGED_CALLERS_ONLY_METHOD`] if the method is marked with the [`UnmanagedCallersOnlyAttribute`].
/// * `load_context`:
/// Extensibility parameter (currently unused and must be 0)
/// * `reserved`:
/// Extensibility parameter (currently unused and must be 0)
/// * `delegate`:
/// Pointer where to store the function pointer result
///
/// [`hostfxr_get_runtime_delegate`]: struct.HostfxrLib.html#method.hostfxr_get_runtime_delegate
/// [`hdt_load_assembly_and_get_function_pointer`]: hostfxr_delegate_type::`hdt_load_assembly_and_get_function_pointer
/// [`UNMANAGED_CALLERS_ONLY_METHOD`]: UNMANAGED_CALLERS_ONLY_METHOD
/// [`UnmanagedCallersOnlyAttribute`]: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute
pub type load_assembly_and_get_function_pointer_fn = unsafe extern "system" fn(
assembly_path: *const char_t,
type_name: *const char_t,
method_name: *const char_t,
delegate_type_name: *const char_t,
reserved: *const c_void,
/*out*/ delegate: *mut *const c_void,
) -> i32;
/// Signature of delegate returned by [`hostfxr_get_runtime_delegate`] for type [`hdt_get_function_pointer`]
///
/// # Arguments
/// * `type_name`:
/// Assembly qualified type name
/// * `method_name`:
/// Public static method name compatible with delegateType
/// * `delegate_type_name`:
/// Assembly qualified delegate type name or [`null`](core::ptr::null()), or [`UNMANAGED_CALLERS_ONLY_METHOD`] if the method is marked with the [`UnmanagedCallersOnlyAttribute`].
/// * `load_context`:
/// Extensibility parameter (currently unused and must be 0)
/// * `reserved`:
/// Extensibility parameter (currently unused and must be 0)
/// * `delegate`:
/// Pointer where to store the function pointer result
///
/// [`hdt_get_function_pointer`]: hostfxr_delegate_type::hdt_get_function_pointer
/// [`hostfxr_get_runtime_delegate`]: struct.HostfxrLib.html#method.hostfxr_get_runtime_delegate
/// [`UNMANAGED_CALLERS_ONLY_METHOD`]: crate::UNMANAGED_CALLERS_ONLY_METHOD
/// [`UnmanagedCallersOnlyAttribute`]: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.unmanagedcallersonlyattribute
pub type get_function_pointer_fn = unsafe extern "system" fn(
type_name: *const char_t,
method_name: *const char_t,
delegate_type_name: *const char_t,
load_context: *const c_void,
reserved: *const c_void,
/*out*/ delegate: *mut *const c_void,
) -> i32;
/// Signature of delegate returned by [`load_assembly_and_get_function_pointer_fn`] when `delegate_type_name == null` (default)
pub type component_entry_point_fn = unsafe extern "system" fn(*const c_void, size_t) -> i32;
/// A structure that stores parameters which are common to all forms of initialization.
#[repr(C)]
pub struct hostfxr_initialize_parameters {
/// The size of the structure.
/// This is used for versioning.
/// Should be set to `mem::size_of::<hostfxr_initialize_parameters>()`.
pub size: size_t,
/// Path to the native host (typically the `.exe`).
/// This value is not used for anything by the hosting components.
/// It's just passed to the CoreCLR as the path to the executable.
/// It can point to a file which is not executable itself, if such file doesn't exist
/// (for example in COM activation scenarios this points to the `comhost.dll`).
/// This is used by PAL (Platform Abstraction Layer) to initialize internal command line structures, process name and so on.
pub host_path: *const char_t,
/// Path to the root of the .NET Core installation in use.
/// This typically points to the install location from which the hostfxr has been loaded.
/// For example on Windows this would typically point to `C:\Program Files\dotnet`.
/// The path is used to search for shared frameworks and potentially SDKs.
pub dotnet_root: *const char_t,
}
impl hostfxr_initialize_parameters {
/// Creates a new instance of [`hostfxr_initialize_parameters`] with the given `host_path`.
/// The `size` field is set accordingly to the size of the struct and `dotnet_root` to [`core::ptr::null()`].
#[must_use]
pub fn with_host_path(host_path: *const char_t) -> hostfxr_initialize_parameters {
hostfxr_initialize_parameters {
size: mem::size_of::<hostfxr_initialize_parameters>(),
host_path,
dotnet_root: core::ptr::null(),
}
}
/// Creates a new instance of [`hostfxr_initialize_parameters`] with the given `dotnet_root`.
/// The `size` field is set accordingly to the size of the struct and `host_path` to [`core::ptr::null()`].
#[must_use]
pub fn with_dotnet_root(dotnet_root: *const char_t) -> hostfxr_initialize_parameters {
hostfxr_initialize_parameters {
size: mem::size_of::<hostfxr_initialize_parameters>(),
host_path: core::ptr::null(),
dotnet_root,
}
}
}
/*
TODO: why does this not work?
macro_rules! derive_apis {
(
$( #[$struct_attrs:meta] )*
$visibility:vis struct $name:ident {
$(
$( #[$field_attrs:meta] )*
$field:ident : $field_type:ty,
)*
}) => {
$visibility mod symbor {
#[allow(unused_imports)]
use super::*;
use dlopen::symbor::{Symbol, SymBorApi};
$( #[$struct_attrs] )*
#[derive(SymBorApi)]
$visibility struct $name <'a> {
$(
$( #[$field_attrs] )*
$field : Symbol<'a, $field_type>
),*
}
}
$visibility mod wrapper {
#[allow(unused_imports)]
use super::*;
use dlopen::wrapper::WrapperApi;
$( #[$struct_attrs] )*
#[derive(WrapperApi)]
$visibility struct $name {
$(
$( #[$field_attrs] )*
$field : $field_type
),*
}
}
}
}
derive_apis! {
pub struct Hostfxr {
...
}
}
*/
/// [`dlopen::symbor`] abstraction for the hostfxr library.
pub mod symbor;
/// [`dlopen::wrapper`] abstraction for the hostfxr library.
pub mod wrapper;