/// <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()))); }
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(); }