Ejemplo n.º 1
0
        ///////////////////////////////////////////////////////////////////////

        private static ReturnCode ToClass2(
            Interpreter interpreter,
            Type type,                     /* NOT USED */
            string text,
            OptionDictionary options,      /* NOT USED */
            CultureInfo cultureInfo,       /* NOT USED */
            IClientData clientData,        /* NOT USED */
            ref MarshalFlags marshalFlags, /* NOT USED */
            ref object value,              /* Sample.Class2 */
            ref Result error
            )
        {
            long     token   = 0;
            ICommand command = null;

            if (interpreter.GetCommand(
                    text, LookupFlags.NoWrapper, ref token, ref command,
                    ref error) == ReturnCode.Ok)
            {
                value = command;
                return(ReturnCode.Ok);
            }

            return(ReturnCode.Error);
        }
Ejemplo n.º 2
0
        ///////////////////////////////////////////////////////////////////////

        #region Public Constructors
        public MarshalClientData(
            object data,
            OptionDictionary options,
            MarshalFlags marshalFlags,
            ReturnCode returnCode,
            Result result
            )
            : this(data)
        {
            this.options      = options;
            this.marshalFlags = marshalFlags;
            this.returnCode   = returnCode;
            this.result       = result;
        }
Ejemplo n.º 3
0
        ///////////////////////////////////////////////////////////////////////

        public static bool HasFlags(
            MarshalFlags flags,
            MarshalFlags hasFlags,
            bool all
            )
        {
            if (all)
            {
                return((flags & hasFlags) == hasFlags);
            }
            else
            {
                return((flags & hasFlags) != MarshalFlags.None);
            }
        }
Ejemplo n.º 4
0
        ///////////////////////////////////////////////////////////////////////

        public bool DoesMatchType(
            object value,
            Type type,
            MarshalFlags marshalFlags
            )
        {
            CheckDisposed();

            if (parentBinder == null)
            {
                throw new InvalidOperationException();
            }

            return(parentBinder.DoesMatchType(value, type, marshalFlags));
        }
Ejemplo n.º 5
0
        private static void LayoutUnmanagedSizeTest()
        {
            Console.WriteLine("running ValueTypeUnmanagedSizeTest...");

            foreach (string assemblyString in testAssemblies)
            {
                Assembly assembly = Assembly.Load(assemblyString);

                foreach (Type type in assembly.GetTypes())
                {
                    if (!type.IsAutoClass &&
                        type != typeof(void) &&
                        type != typeof(ArrayWithOffset) &&
                        type != typeof(HandleRef))
                    {
                        int size_reported_by_clr;

                        try
                        {
                            // will fail when CLR thinks the type has no layout
                            size_reported_by_clr = Marshal.SizeOf(type);
                        }
                        catch (Exception)
                        {
                            continue;
                        }

                        MarshalFlags flags = MarshalFlags.AnsiStrings | MarshalFlags.StructField;
                        if (runningOn64Bit)
                        {
                            flags |= MarshalFlags.Platform64Bit;
                        }

                        NativeType native_type = NativeType.FromClrType(type, flags);

                        if (native_type.TypeSize != size_reported_by_clr)
                        {
                            Console.WriteLine("* size mismatch for {0} (CLR {1}, tool {2})",
                                              type.FullName,
                                              size_reported_by_clr,
                                              native_type.TypeSize);
                        }
                    }
                }
            }
        }
Ejemplo n.º 6
0
        public ChangeTypeData(
            string caller,
            Type type,
            object oldValue,
            OptionDictionary options,
            CultureInfo cultureInfo,
            IClientData clientData,
            MarshalFlags marshalFlags
            )
        {
            this.caller       = caller;
            this.type         = type;
            this.oldValue     = oldValue;
            this.options      = options;
            this.cultureInfo  = cultureInfo;
            this.clientData   = clientData;
            this.marshalFlags = marshalFlags;

            ///////////////////////////////////////////////////////////////////

            Initialize();
        }
Ejemplo n.º 7
0
        ///////////////////////////////////////////////////////////////////////

        public ReturnCode InvokeChangeTypeCallback(
            ChangeTypeCallback callback,
            Type type,
            string text,
            OptionDictionary options,
            CultureInfo cultureInfo,
            IClientData clientData,
            ref MarshalFlags marshalFlags,
            ref object value,
            ref Result error
            )
        {
            CheckDisposed();

            if (parentBinder == null)
            {
                throw new InvalidOperationException();
            }

            return(parentBinder.InvokeChangeTypeCallback(
                       callback, type, text, options, cultureInfo, clientData,
                       ref marshalFlags, ref value, ref error));
        }
Ejemplo n.º 8
0
        ///////////////////////////////////////////////////////////////////////

        private static ReturnCode FromClass2(
            Interpreter interpreter,       /* NOT USED */
            Type type,                     /* NOT USED */
            object value,
            OptionDictionary options,      /* NOT USED */
            CultureInfo cultureInfo,       /* NOT USED */
            IClientData clientData,        /* NOT USED */
            ref MarshalFlags marshalFlags, /* NOT USED */
            ref string text,
            ref Result error
            )
        {
            if (value is Class2)
            {
                text = ((Class2)value).Description;
                return(ReturnCode.Ok);
            }
            else
            {
                error = "type mismatch, need Class2";
            }

            return(ReturnCode.Error);
        }
Ejemplo n.º 9
0
        protected override void Initialize(TypeDefKey key)
        {
            Type type = key.Type;

            Debug.Assert(type.IsValueType || Utility.HasLayout(type));

            this.name        = Utility.GetNameOfType(type);
            this.isBlittable = Utility.IsStructBlittable(type,
                                                         (key.Flags & MarshalFlags.AnsiPlatform) == MarshalFlags.AnsiPlatform);

            // reflect the structure
            FieldInfo[] fis = type.GetFields(bindingFlags);

            this.fields = new NativeField[fis.Length];
            KeyValuePair <int, NativeField>[] fields_with_tokens = new KeyValuePair <int, NativeField> [fis.Length];

            MarshalFlags flags = key.Flags & ~(MarshalFlags.AnsiStrings | MarshalFlags.UnicodeStrings);

            flags |= Utility.GetCharSetMarshalFlag(type);

            for (int i = 0; i < fis.Length; i++)
            {
                NativeField nf = NativeField.FromClrField(fis[i], flags);
                this.fields[i] = nf;

                // check for misaligned reference type fields
                // (can only be misaligned if layout was specified explicitly)
                if (nf.Offset.HasValue && nf.ContainsManagedReference)
                {
                    int ptr_size = TypeName.GetPointerSize((key.Flags & MarshalFlags.Platform64Bit) == MarshalFlags.Platform64Bit);
                    if (nf.Offset.Value % ptr_size != 0)
                    {
                        Log.Add(Errors.ERROR_MisalignedReferenceTypeField, nf.Name);
                    }
                }

                if (nf.Type.TypeSize == 0)
                {
                    // this means that the field type is another structure whose size has not been set up
                    // yet -> there are circular dependencies among structures
                    this.isInvalid = true;

                    Log.Add(Errors.ERROR_RecursiveStructureDeclaration, nf.Name);
                }

                if (type.IsExplicitLayout && !nf.Offset.HasValue)
                {
                    Log.Add(Errors.ERROR_NoFieldOffsetInSequentialLayout, nf.Name);
                }

                fields_with_tokens[i] = new KeyValuePair <int, NativeField>(fis[i].MetadataToken, nf);
            }

            // sort fields to reflect the layout
            if (type.IsExplicitLayout)
            {
                this.isExplicitLayout = true;

                // explicit layout - sort according to offsets
                Array.Sort <KeyValuePair <int, NativeField>, NativeField>(
                    fields_with_tokens,
                    this.fields,
                    ExplicitFieldComparer.Instance);

                // managed references overlapping with other fields are not checked here - such errors are
                // reported by the loader and assemblies containing these types are never loaded
            }
            else
            {
                // sequential layout - sort according to metadata tokens
                Array.Sort <KeyValuePair <int, NativeField>, NativeField>(
                    fields_with_tokens,
                    this.fields,
                    SequentialFieldComparer.Instance);
            }

            SetupSizeAndAlignment(type);
            SetupIsUnionFlag();
        }
Ejemplo n.º 10
0
 public TypeDefKeyWithUnmanagedType(Type type, MarshalFlags flags, UnmanagedType unmanagedType)
     : base(type, flags)
 {
     this.UnmanagedType = unmanagedType;
 }
Ejemplo n.º 11
0
        private static void LayoutUnmanagedPrintoutTest()
        {
            string file_name = "_test.cpp";

            Console.WriteLine("running ValueTypeUnmanagedPrintoutTest...");

            // we'll generate a C++ source file with all the unmanaged structures
            // - it should compile
            // - the C++ sizeof operator should return the intended size
            // - the C++ offsetof macro should return the same offsets as Marshal.OffsetOf

            Console.WriteLine("  generating definitions...");

            using (TextWriterCodePrinter printer = new TextWriterCodePrinter(new StreamWriter(file_name)))
            {
                // prepare a memory printer to print main to
                CodeMemoryPrinter main_printer = new CodeMemoryPrinter();

                main_printer.PrintLn(OutputType.Other, "#define VERIFY(cond) if (!(cond)) printf(\"* \\\"%s\\\" violated\\n\", #cond)");

                main_printer.PrintLn(OutputType.Other, "int main()");
                main_printer.Print(OutputType.Other, "{");
                main_printer.Indent();
                main_printer.PrintLn();

                LogMemoryPrinter log_printer = new LogMemoryPrinter();

                printer.PrintLn(OutputType.Other, "#include <stddef.h>");
                printer.PrintLn(OutputType.Other, "#include <stdio.h>");
                printer.PrintLn(OutputType.Other, "#include <windows.h>");
                printer.PrintLn(OutputType.Other, "#include <oaidl.h>");

                printer.PrintLn();

                int counter = 0;
                foreach (string assemblyString in testAssemblies)
                {
                    Assembly assembly = Assembly.Load(assemblyString);

                    foreach (Type type in assembly.GetTypes())
                    {
                        if (!type.IsAutoClass)
                        {
                            int size_reported_by_clr;

                            try
                            {
                                // will fail when CLR thinks the type has no layout
                                size_reported_by_clr = Marshal.SizeOf(type);
                            }
                            catch (Exception)
                            {
                                continue;
                            }

                            MarshalFlags flags = MarshalFlags.AnsiStrings | MarshalFlags.StructField;
                            if (runningOn64Bit)
                            {
                                flags |= MarshalFlags.Platform64Bit;
                            }

                            NativeType        native_type     = NativeType.FromClrType(type, flags);
                            DefinedNativeType def_native_type = native_type as DefinedNativeType;

                            if (def_native_type != null)
                            {
                                // dump the "closure" of this definition to a namespace
                                string ns_name = String.Format("_CLR_{0}", counter++);

                                printer.PrintLn(OutputType.Other, "namespace " + ns_name);
                                printer.Print(OutputType.Other, "{");
                                printer.Indent();
                                printer.PrintLn();

                                NativeTypeDefinitionSet set = new NativeTypeDefinitionSet();
                                set.Add(def_native_type.Definition);
                                def_native_type.Definition.GetDefinitionsRecursive(set, def_native_type.Definition);

                                // enumerate the closure (will respect dependencies and return definitions
                                // in a correct order introducing forward declarations if necessary)
                                foreach (NativeTypeDefinition def in set)
                                {
                                    def.PrintTo(printer, log_printer,
                                                //PrintFlags.UsePlainC |
                                                PrintFlags.UseDefinedComInterfaces |
                                                PrintFlags.MangleEnumFields);

                                    printer.PrintLn();
                                    printer.PrintLn();
                                }

                                printer.Unindent();
                                printer.PrintLn();
                                printer.PrintLn(OutputType.Other, "};");

                                // add tests to main()
                                main_printer.PrintLn(OutputType.Other, String.Format(
                                                         "VERIFY(sizeof({0}::{1}) == {2});",
                                                         ns_name,
                                                         def_native_type.Definition.Name,
                                                         size_reported_by_clr));

                                StructureDefinition struct_def = def_native_type.Definition as StructureDefinition;
                                if (struct_def != null)
                                {
                                    for (int i = 0; i < struct_def.FieldCount; i++)
                                    {
                                        NativeField nf = struct_def.GetField(i);

                                        int offset;
                                        try
                                        {
                                            offset = (int)Marshal.OffsetOf(type, nf.Name);
                                        }
                                        catch (Exception)
                                        {
                                            continue;
                                        }

                                        // if we think we know the offset of this field, we will verify it
                                        main_printer.PrintLn(OutputType.Other, String.Format(
                                                                 "VERIFY(offsetof({0}::{1}, {2}) == {3});",
                                                                 ns_name,
                                                                 def_native_type.Definition.Name,
                                                                 nf.Name,
                                                                 offset));
                                    }
                                }
                            }
                        }
                    }
                }

                main_printer.Print(OutputType.Other, "return 0;");
                main_printer.Unindent();
                main_printer.PrintLn();
                main_printer.PrintLn(OutputType.Other, "}");

                main_printer.ReplayTo(printer);
            }

            Console.WriteLine("  compiling the generated file...");

            ProcessStartInfo start_info = new ProcessStartInfo(
                @"c:\Program Files (x86)\Microsoft Visual Studio 8\VC\bin\cl.exe", "/DUNICODE " + file_name);

            start_info.WorkingDirectory       = Directory.GetCurrentDirectory();
            start_info.UseShellExecute        = false;
            start_info.CreateNoWindow         = true;
            start_info.RedirectStandardOutput = true;

            Process cl_proc = Process.Start(start_info);

            cl_proc.WaitForExit();

            Console.WriteLine(cl_proc.StandardOutput.ReadToEnd());

            Console.WriteLine("  running the generated executable...");

            start_info.FileName  = Path.ChangeExtension(file_name, ".exe");
            start_info.Arguments = String.Empty;

            Process tst_proc = Process.Start(start_info);

            tst_proc.WaitForExit();

            Console.WriteLine(tst_proc.StandardOutput.ReadToEnd());
        }
Ejemplo n.º 12
0
 public TypeDefKeyWithUnmanagedType(Type type, MarshalFlags flags, UnmanagedType unmanagedType)
     : base(type, flags)
 {
     this.UnmanagedType = unmanagedType;
 }