public MethodDeclaration(MethodDesc method, BaseTypeDeclaration container, AccessModifierType accessModifier, bool isNew = false, TextBlock code = null, string nameOverride = null)
            : base(container, 0)
        {
            string additionalModifier = (accessModifier == AccessModifierType.Empty ? "" : " ") + ((method.Dll != null) ? "static extern " : "") + "unsafe " + (isNew ? "new " : "");

            if (code == null)
            {
                if (method.Dll != null)
                    WriteLine(() => "[DllImport(\"" + method.Dll + "\", EntryPoint = \"" + method.EntryPoint + "\", CallingConvention = CallingConvention." + method.Convention.ToString() + ", CharSet = CharSet.Unicode, SetLastError = true)]");
                else
                    WriteLine(() => "[PreserveSig]");
            }

            WriteLine(() => accessModifier + additionalModifier + GetReturnValue(method) + " " + ((nameOverride == null) ? method.Name : nameOverride) + "(" + GetParameters(method) + ")" + ((code == null) ? ";" : ""));
            if (code != null)
                AddTextBlock(code);
        }
 public static string GetReturnValue(MethodDesc method)
 {
     return GetParameterTypeDeclaration(method.ReturnValue);
 }
 public static string GetParameters(MethodDesc method)
 {
     return string.Join(", ", method.Parameters.Select(x => GetParameterTypeDeclaration(x) + " " + x.Name + (x.HasValue ? (" = " + GetValueInitializer(x)) : "")));
 }
 public static IEnumerable<string> GetParameterNames(MethodDesc method)
 {
     return method.Parameters.Select(x => x.Name);
 }
 public DelegateDeclaration(TypeDesc type, TextBlock container, AccessModifierType accessModifier)
     : base(new TypeDesc("void"), container, accessModifier)
 {
     this.method = type.Methods.Single(x => x.Name == type.Name);
     prefix = "_";
 }
 public DelegateDeclaration(MethodDesc method, TextBlock container, AccessModifierType accessModifier)
     : base(new TypeDesc("void"), container, accessModifier)
 {
     this.method = method;
 }
            public DelegateCaller(MethodDesc method, DelegateWrapperDeclaration container)
                : base(container, 0)
            {
                DelegateDeclaration delegateDeclaration = new DelegateDeclaration(container.Type, container, container.AccessModifier);

                string returnDecl = MethodDeclaration.GetReturnValue(method);
                IEnumerable<string> argumentNames = MethodDeclaration.GetParameterNames(method);

                WriteLine(() => "{");
                WriteLine(() => "    if (reference == IntPtr.Zero)");
                WriteLine(() => "        throw new InvalidComObjectException();");
                WriteLine(() => "    Delegate genericDelegate = Marshal.GetDelegateForFunctionPointer(reference, typeof(" + delegateDeclaration.DelegateTypeName + "));");
                WriteLine(() => "    " + delegateDeclaration.DelegateTypeName + " method = (" + delegateDeclaration.DelegateTypeName + ")genericDelegate;");
                WriteLine(() => "    " + ((returnDecl == "void") ? "" : "return ") + "method(" + string.Join(", ", argumentNames) + ");");
                WriteLine(() => "}");
            }
            public DelegateCaller(int index, MethodDesc method, InterfaceWrapperDeclaration container)
                : base(container, 0)
            {
                string delegateName = container.GetDelegateName(index);
                string vtblMethodName = container.GetMethodName(index);

                string returnDecl = MethodDeclaration.GetReturnValue(method);
                IEnumerable<string> argumentNames = MethodDeclaration.GetParameterNames(method);

                WriteLine(() => "{");
                WriteLine(() => "    " + container.vtbl.TypeName + "** @this = (" + container.vtbl.TypeName + "**)reference;");
                WriteLine(() => "    " + container.vtbl.TypeName + "* vtbl = *@this;");
                WriteLine(() => "    if (vtbl == null)");
                WriteLine(() => "        throw new InvalidComObjectException();");
                WriteLine(() => "    Delegate genericDelegate = Marshal.GetDelegateForFunctionPointer(vtbl->" + vtblMethodName + ", typeof(" + delegateName + "));");
                WriteLine(() => "    " + delegateName + " method = (" + delegateName + ")genericDelegate;");
                WriteLine(() => "    " + ((returnDecl == "void") ? "" : "return ") + "method(" + string.Join(", ", new string[] { "@this" }.Union(argumentNames)) + ");");
                WriteLine(() => "}");
            }
        private static bool IsInherited(MethodDesc method, TypeDesc type)
        {
            string[] array1 = new string[] { method.Name, method.ReturnValue.TypeDeclaration }.Union(method.Parameters.Select(x => x.TypeDeclaration)).ToArray();

            foreach (MethodDesc currentMethod in type.Methods)
            {
                string[] array2 = new string[] { currentMethod.Name, currentMethod.ReturnValue.TypeDeclaration }.Union(currentMethod.Parameters.Select(x => x.TypeDeclaration)).ToArray();

                if (array1.SequenceEqual(array2))
                    return false;
            }
            return true;
        }