Пример #1
0
        /// <summary>
        /// Parses a CIL byte array describing a custom attribute instantiation.
        /// </summary>
        /// <returns>Attribute builder</returns>
        public static AttributeSpec Parse(ConstructorInfo ctor, byte[] blob)
        {
            if (!typeof(Attribute).IsAssignableFrom(ctor.DeclaringType))
            {
                throw new ArgumentException($"Cannot get attribute because {ctor.DeclaringType} is not an attribute type.");
            }

            using var reader = new BlobReader(blob, ctor.DeclaringType.Assembly);

            if (reader.ReadByte() != 0x01 || reader.ReadByte() != 0x00)
            {
                throw new ArgumentException("Blob could not be parsed: invalid prolog");
            }

            ParameterInfo[] paramArray = ctor.GetParameters();
            var             ctorArgs   = new object[paramArray.Length];

            for (int i = 0; i < paramArray.Length; ++i)
            {
                ctorArgs[i] = reader.ReadFixedArgOfType(paramArray[i].ParameterType);
            }

            List <NamedArg> namedArgs = new List <NamedArg>();

            int countNumNamed = reader.ReadUInt16();

            for (int i = 0; i < countNumNamed; ++i)
            {
                NamedArg arg;

                switch (reader.ReadByte())
                {
                case BlobReader.FIELD: arg = new FieldArg(); break;

                case BlobReader.PROPERTY: arg = new PropertyArg(); break;

                default: throw new ArgumentException($"Unexpected token at index {reader.BaseStream.Position}: should have received named arg type byte.");
                }

                Type type = reader.ReadFieldOrPropType();
                arg.Name  = reader.ReadSerString();
                arg.Value = reader.ReadFixedArgOfType(type);
                arg.Type  = ctor.DeclaringType;

                namedArgs.Add(arg);
            }

            if (!reader.Completed)
            {
                throw new ArgumentException("Finished parsing blob before end");
            }

            return(new AttributeSpec(ctor, ctorArgs, namedArgs.Select(a => a.ToArgument())));
        }
Пример #2
0
        public Program(string app_id, string app_version, ModuleInfo module, string[] argv, params object[] props) : base(IntPtr.Zero)
        {
            if (app_id.IndexOf(" ") > 0)
            {
                throw new ArgumentException("app_id argument can't contain spaces.");
            }

            int nargs = props.Length / 2;

            PropertyArg[] args     = new PropertyArg[nargs];
            GLib.Value[]  vals     = new GLib.Value[nargs];
            string[]      new_argv = new string[argv.Length + 1];

            g_type_init();

            for (int i = 0; i < nargs; i++)
            {
                args[i].name = (string)props[i * 2];
                GLib.Value value;
                // FIXME: handle more types
                object prop = props[i * 2 + 1];
                Type   type = prop.GetType();
                if (type == "hello".GetType())
                {
                    value = new GLib.Value((string)prop);
                }
                else if (type == true.GetType())
                {
                    value = new GLib.Value((bool)prop);
                }
                else
                {
                    value = GLib.Value.Empty;
                }
                vals[i]       = value;
                args[i].value = value;
            }

            /* FIXME: Is there a way to access this in .NET? */
            new_argv[0] = app_id;
            Array.Copy(argv, 0, new_argv, 1, argv.Length);

            GLib.Argv gargv = new GLib.Argv(new_argv, false);
            Raw = gtksharp_gnome_program_init(app_id, app_version, module.Handle, new_argv.Length, gargv.Handle, nargs, args);
            PersistentData["glib_argv"] = gargv;

            //
            // Dynamically reset the signal handlers, because Gnome overwrites them
            //
            Type mono_runtime_type = Type.GetType("Mono.Runtime");

            if (mono_runtime_type != null)
            {
                object [] iargs = new object [0];
                System.Reflection.MethodInfo mi = mono_runtime_type.GetMethod("InstallSignalHandlers", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);

                mi.Invoke(null, iargs);
            }

            HardenRef();
        }