public CallbackHolder(DotNetCallback toWrap, NativeNodeHost parent) { Wrapped = toWrap; _wrapper = OnCalled; CallbackPtr = Marshal.GetFunctionPointerForDelegate(_wrapper); _parent = parent; }
public TaskHolder(Task task, NativeNodeHost parent) { _task = task; _wrapper = OnCalled; CallbackPtr = Marshal.GetFunctionPointerForDelegate(_wrapper); _parent = parent; }
internal static DotNetValue RunHostedApplication(IntPtr context, NativeApi nativeMethods, int argc, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 2)] string[] argv) { var host = new NativeNodeHost(context, nativeMethods); NodeHost.Instance = new NodeBridge(host); try { var assembly_path = argv[0]; var assembly = Assembly.Load(Path.GetFileNameWithoutExtension(assembly_path)); var entryPoint = assembly.EntryPoint; if (entryPoint.IsSpecialName && entryPoint.Name.StartsWith("<") && entryPoint.Name.EndsWith(">")) { entryPoint = entryPoint.DeclaringType.GetMethod(entryPoint.Name.Substring(1, entryPoint.Name.Length - 2), BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); } var result = host.Scheduler .RunCallbackSynchronously(s => entryPoint.Invoke(null, new object[] { argv.Skip(1).ToArray() }), null); return(DotNetValue.FromObject(result, host)); } catch (TargetInvocationException tie) { return(DotNetValue.FromObject(tie.InnerException, host)); } catch (Exception e) { return(DotNetValue.FromObject(e, host)); } }
internal static void RunHostedApplication(IntPtr context, IntPtr nativeMethodsPtr, int argc, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 2)] string[] argv, IntPtr resultValue) { // Switch to default ALC var myAlc = AssemblyLoadContext.GetLoadContext(typeof(NativeEntryPoint).Assembly); if (myAlc != AssemblyLoadContext.Default) { var inCtx = AssemblyLoadContext.Default.LoadFromAssemblyName(typeof(NativeEntryPoint).Assembly.GetName()); var tInCtx = inCtx.GetType(typeof(NativeEntryPoint).FullName); tInCtx.GetMethod(nameof(RunHostedApplication), BindingFlags.Static | BindingFlags.NonPublic) .Invoke(null, new object[] { context, nativeMethodsPtr, argc, argv, resultValue }); return; } var nativeMethods = Marshal.PtrToStructure <NativeApi>(nativeMethodsPtr); var host = new NativeNodeHost(context, nativeMethods); NodeHost.Instance = new NodeBridge(host); try { var assembly_path = argv[0]; var assembly = Assembly.Load(Path.GetFileNameWithoutExtension(assembly_path)); var entryPoint = assembly.EntryPoint; if (entryPoint.IsSpecialName && entryPoint.Name.StartsWith("<") && entryPoint.Name.EndsWith(">")) { entryPoint = entryPoint.DeclaringType.GetMethod(entryPoint.Name.Substring(1, entryPoint.Name.Length - 2), BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); } var result = host.Scheduler .RunCallbackSynchronously(s => entryPoint.Invoke(null, new object[] { argv.Skip(1).ToArray() }), null); Marshal.StructureToPtr(DotNetValue.FromObject(result, host), resultValue, false); } catch (TargetInvocationException tie) { Marshal.StructureToPtr(DotNetValue.FromObject(tie.InnerException, host), resultValue, false); } catch (Exception e) { Marshal.StructureToPtr(DotNetValue.FromObject(e, host), resultValue, false); } }