Beispiel #1
0
 public CallbackHolder(DotNetCallback toWrap, NativeNodeHost parent)
 {
     Wrapped     = toWrap;
     _wrapper    = OnCalled;
     CallbackPtr = Marshal.GetFunctionPointerForDelegate(_wrapper);
     _parent     = parent;
 }
Beispiel #2
0
 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);
            }
        }