using System; using System.Runtime.InteropServices; namespace Wasmtime { /// /// Represents a WebAssembly module. /// public class Module : IDisposable { internal Module(Store store, string name, byte[] bytes) { if (store.Handle.IsInvalid) { throw new ArgumentNullException(nameof(store)); } var bytesHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned); try { unsafe { Interop.wasm_byte_vec_t vec; vec.size = (UIntPtr)bytes.Length; vec.data = (byte*)bytesHandle.AddrOfPinnedObject(); Handle = Interop.wasm_module_new(store.Handle, ref vec); } if (Handle.IsInvalid) { throw new WasmtimeException($"WebAssembly module '{name}' is not valid."); } } finally { bytesHandle.Free(); } Store = store; Name = name; Imports = new Wasmtime.Imports.Imports(this); Exports = new Wasmtime.Exports.Exports(this); } /// /// Instantiates a WebAssembly module for the given host. /// /// The host to use for the WebAssembly module's instance. /// Returns a new . public Instance Instantiate(IHost host) { if (host is null) { throw new ArgumentNullException(nameof(host)); } if (host.Instance != null) { throw new InvalidOperationException("The host has already been associated with an instantiated module."); } host.Instance = new Instance(this, host); return host.Instance; } /// /// The associated with the module. /// public Store Store { get; private set; } /// /// The name of the module. /// public string Name { get; private set; } /// /// The imports of the module. /// public Wasmtime.Imports.Imports Imports { get; private set; } /// /// The exports of the module. /// /// public Wasmtime.Exports.Exports Exports { get; private set; } /// public void Dispose() { if (!Handle.IsInvalid) { Handle.Dispose(); Handle.SetHandleAsInvalid(); } } internal Interop.ModuleHandle Handle { get; private set; } } }