Beispiel #1
0
 internal void InitAssemblyMethods(XmlMapping[] xmlMappings)
 {
     _methods = new TempMethodDictionary();
     for (int i = 0; i < xmlMappings.Length; i++)
     {
         TempMethod     method         = new TempMethod();
         XmlTypeMapping xmlTypeMapping = xmlMappings[i] as XmlTypeMapping;
         if (xmlTypeMapping != null)
         {
             method.name = xmlTypeMapping.ElementName;
             method.ns   = xmlTypeMapping.Namespace;
         }
         _methods.Add(xmlMappings[i].Key, method);
     }
 }
Beispiel #2
0
        internal bool CanRead(XmlMapping mapping, XmlReader xmlReader)
        {
            if (mapping == null)
            {
                return(false);
            }

            if (mapping.Accessor.Any)
            {
                return(true);
            }
            TempMethod method = _methods[mapping.Key];

            return(xmlReader.IsStartElement(method.name, method.ns));
        }
 internal void InitAssemblyMethods(XmlMapping[] xmlMappings)
 {
     this.methods = new TempMethodDictionary();
     for (int i = 0; i < xmlMappings.Length; i++)
     {
         TempMethod method = new TempMethod {
             isSoap = xmlMappings[i].IsSoap,
             methodKey = xmlMappings[i].Key
         };
         XmlTypeMapping mapping = xmlMappings[i] as XmlTypeMapping;
         if (mapping != null)
         {
             method.name = mapping.ElementName;
             method.ns = mapping.Namespace;
         }
         this.methods.Add(xmlMappings[i].Key, method);
     }
 }
 internal void Add(string key, TempMethod value)
 {
     Dictionary.Add(key, value);
 }
 internal void InitAssemblyMethods(XmlMapping[] xmlMappings) {
     methods = new TempMethodDictionary();
     for (int i = 0; i < xmlMappings.Length; i++) {
         TempMethod method = new TempMethod();
         method.isSoap = xmlMappings[i].IsSoap;
         method.methodKey = xmlMappings[i].Key;
         XmlTypeMapping xmlTypeMapping = xmlMappings[i] as XmlTypeMapping;
         if (xmlTypeMapping != null) {
             method.name = xmlTypeMapping.ElementName;
             method.ns = xmlTypeMapping.Namespace;
         }
         methods.Add(xmlMappings[i].Key, method);
     }
 }
 internal void Add(string key, TempMethod value) {
     Dictionary.Add(key, value);
 }
        }  // END public void CompileAndExecute(String pCodeToCompile ...)

        /// <summary>
        /// This compiles with additional information returned.  CompileAndExecute
        /// does not return the detailed compiled information.
        /// </summary>
        /// <param name="pCodeToCompile"></param>
        /// <param name="pReferencedAssemblies"></param>
        /// <param name="pMainClassName"></param>
        /// <param name="pInstanceName"></param>
        /// <param name="pExecutionMethodName"></param>
        /// <param name="pMethodParameters"></param>
        /// <returns></returns>
        public List <String> Compile(String pCodeToCompile,
                                     List <String> pReferencedAssemblies,
                                     String pMainClassName,
                                     out String pFullTypeName,
                                     out String pModuleName,
                                     out List <String> pConstructors,
                                     out List <String> pMembers,
                                     out List <String> pFields,
                                     out List <String> pMethods,
                                     out List <String> pProperties)
        {
            List <String> ReturnVal = new List <String>();

            Dictionary <String, String> DOMProviderOptions = null;

            CSharpCodeProvider DOMProvider = null;

            CompilerParameters DOMCompilerParams = null;

            pFullTypeName = "";
            pModuleName   = "";
            pConstructors = new List <String>();
            pMembers      = new List <String>();
            pFields       = new List <String>();
            pMethods      = new List <String>();
            pProperties   = new List <String>();

            try
            {
                DOMProviderOptions = new Dictionary <String, String>();

                DOMProviderOptions.Add(COMPILER_VERSION_KEY, COMPILER_VERSION_SUPPORTED);

                DOMProvider = new CSharpCodeProvider(DOMProviderOptions);

                DOMCompilerParams = new CompilerParameters();

                if (pReferencedAssemblies != null)
                {
                    if (pReferencedAssemblies.Count > 0)
                    {
                        foreach (String RefAssembly in pReferencedAssemblies)
                        {
                            if (RefAssembly != null)
                            {
                                if (RefAssembly.Length > 0)
                                {
                                    DOMCompilerParams.ReferencedAssemblies.Add(RefAssembly);
                                } // END if (File.Exists(pExecutableFullPath))
                                else
                                {
                                    ReturnVal.Add(String.Format("A reference file was empty.{0}", Environment.NewLine));
                                }
                            }  // END if (pExecutableFullPath.Length > 0)
                            else
                            {
                                ReturnVal.Add(String.Format("A reference file was null.{0}", Environment.NewLine));
                            }
                        } // END foreach (String RefAssembly in pReferencedAssemblies)
                    }     // END if (pReferencedAssemblies.Count > 0)
                }         // END if (pReferencedAssemblies != null)

                // These references will always be there to support the code compiling
                if (!DOMCompilerParams.ReferencedAssemblies.Contains("System.dll"))
                {
                    DOMCompilerParams.ReferencedAssemblies.Add("System.dll");
                }

                if (!DOMCompilerParams.ReferencedAssemblies.Contains("System.Windows.Forms.dll"))
                {
                    DOMCompilerParams.ReferencedAssemblies.Add("System.Windows.Forms.dll");
                }

                if (!DOMCompilerParams.ReferencedAssemblies.Contains("System.Runtime.Serialization.dll"))
                {
                    DOMCompilerParams.ReferencedAssemblies.Add("System.Runtime.Serialization.dll");
                }

                // Adds this executable.
                DOMCompilerParams.ReferencedAssemblies.Add(System.Reflection.Assembly.GetEntryAssembly().Location);

                DOMCompilerParams.GenerateInMemory        = true;
                DOMCompilerParams.GenerateExecutable      = false;
                DOMCompilerParams.CompilerOptions         = "/optimize";
                DOMCompilerParams.IncludeDebugInformation = true;
                DOMCompilerParams.MainClass = pMainClassName;

                CompilerResults CompileResults = DOMProvider.CompileAssemblyFromSource(DOMCompilerParams, pCodeToCompile);

                if (CompileResults != null)
                {
                    if (CompileResults.Errors.Count != 0)
                    {
                        foreach (CompilerError oErr in CompileResults.Errors)
                        {
                            ReturnVal.Add(String.Format("Error# [{0}] - [{1}] Line# [{2}] Column# [{3}].{4}",
                                                        oErr.ErrorNumber.ToString(), oErr.ErrorText, oErr.Line.ToString(),
                                                        oErr.Column.ToString(), Environment.NewLine));
                        } // END foreach (CompilerError oErr in CompileResults.Errors)
                    }     // END if (CompileResults.Errors.Count != 0)
                    else
                    {
                        Type[] ObjectTypes = CompileResults.CompiledAssembly.GetTypes();

                        // List<String> pMembers, List<String> pFields, List<String> pMethods, List<String> pProperties
                        if (ObjectTypes.Length > 0)
                        {
                            pFullTypeName = ObjectTypes[0].FullName;

                            Object CompiledObject = CompileResults.CompiledAssembly.CreateInstance(pFullTypeName);

                            Type CompiledType = CompiledObject.GetType();

                            pModuleName = CompiledType.Module.ScopeName;

                            // Beginning here, you could create and populate class instances that
                            // contain information gleaned from constructors, methods, members,
                            // properties, etc. and their parameters instead of passing back these
                            // generalized descriptions.
                            ConstructorInfo[] TempConstructors = CompiledType.GetConstructors();

                            foreach (ConstructorInfo TempConstructor in TempConstructors)
                            {
                                String StringToAdd = "";

                                if (TempConstructor.Name == ".ctor")
                                {
                                    StringToAdd = "void " + ObjectTypes[0].Name;
                                }
                                else
                                {
                                    StringToAdd = "void " + TempConstructor.Name;
                                }

                                String ParmString = "";

                                if (TempConstructor.Module.ScopeName.Equals(pModuleName))
                                {
                                    ParameterInfo[] TempConstructorParam = TempConstructor.GetParameters();

                                    foreach (ParameterInfo TempParam in TempConstructorParam)
                                    {
                                        ParmString += String.Format("{0} {1}, ", TempParam.ParameterType.FullName, TempParam.Name);
                                    }
                                }

                                StringToAdd += "(" + ParmString + ")";

                                pConstructors.Add(StringToAdd);
                            }

                            MemberInfo[] TempDefaultMembers = CompiledType.GetDefaultMembers();

                            // List<String> pFields, List<String> pMethods, List<String> pProperties
                            if (TempDefaultMembers.Length > 0)
                            {
                                foreach (MemberInfo TempMember in TempDefaultMembers)
                                {
                                    if (TempMember.Module.ScopeName.Equals(pModuleName))
                                    {
                                        String StringToAdd = "";

                                        StringToAdd = String.Format("{0} {1}, ", TempMember.ReflectedType.FullName, TempMember.Name);

                                        pMembers.Add(StringToAdd);
                                    } // END if (TempMember.Module.ScopeName.Equals(pModuleName))
                                }     // END if (TempDefaultMembers.Length > 0)
                            }         // END if (TempDefaultMembers.Length > 0)

                            FieldInfo[] TempFields = CompiledType.GetFields();

                            // List<String> pFields, List<String> pMethods, List<String> pProperties
                            if (TempFields.Length > 0)
                            {
                                foreach (FieldInfo TempField in TempFields)
                                {
                                    if (TempField.Module.ScopeName.Equals(pModuleName))
                                    {
                                        String StringToAdd = "";

                                        StringToAdd = String.Format("{0} {1}, ", TempField.ReflectedType.FullName, TempField.Name);

                                        pFields.Add(StringToAdd);
                                    } // END if (TempField.Module.ScopeName.Equals(pModuleName))
                                }     // END foreach (FieldInfo TempField in TempFields)
                            }         // END if (TempFields.Length > 0)


                            MemberInfo[] TempMembers = CompiledType.GetMembers();

                            // List<String> pProperties
                            if (TempMembers.Length > 0)
                            {
                                foreach (MemberInfo TempMember in TempMembers)
                                {
                                    if (TempMember.Module.ScopeName.Equals(pModuleName))
                                    {
                                        String StringToAdd = "";

                                        StringToAdd = TempMember.ToString();  // String.Format("{0} {1}, ", TempMember.GetType().FullName, TempMember.Name);

                                        pMembers.Add(StringToAdd);
                                    }
                                } // END if (TempDefaultMembers.Length > 0)
                            }     // END if (TempDefaultMembers.Length > 0)


                            MethodInfo[] TempMethods = CompiledType.GetMethods();

                            foreach (MethodInfo TempMethod in TempMethods)
                            {
                                if ((TempMethod.Module.ScopeName.Equals(pModuleName)) && (!TempMethod.IsSpecialName))
                                {
                                    String StringToAdd = "";

                                    StringToAdd = String.Format("{0} {1}, ", TempMethod.ReturnType.FullName, TempMethod.Name);

                                    ParameterInfo[] TempParams = TempMethod.GetParameters();

                                    String ParmString = "";

                                    foreach (ParameterInfo TempParam in TempParams)
                                    {
                                        String ParamName     = TempParam.Name;
                                        String ParamTypeName = TempParam.ParameterType.FullName;
                                        Object DefaultValue  = TempParam.DefaultValue;

                                        if (DefaultValue.ToString().Length == 0)
                                        {
                                            ParmString += String.Format("{0} {1}, ", ParamTypeName, ParamName);
                                        }
                                        else
                                        {
                                            ParmString += String.Format("{0} {1}={2}, ", ParamTypeName, ParamName, DefaultValue.ToString());
                                        }
                                    }  // END foreach (ParameterInfo TempParam in TempParams)

                                    if (ParmString.EndsWith(", "))
                                    {
                                        ParmString = ParmString.Substring(0, ParmString.Length - 2);
                                    }

                                    StringToAdd += "(" + ParmString + ")";

                                    pMethods.Add(StringToAdd);
                                } // END if (TempMethod.Module.ScopeName.Equals(pModuleName))
                            }     // END foreach (MethodInfo TempMethod in TempMethods)


                            PropertyInfo[] TempProperties = CompiledType.GetProperties();

                            // List<String> pProperties
                            if (TempProperties.Length > 0)
                            {
                                foreach (PropertyInfo TempProperty in TempProperties)
                                {
                                    if (TempProperty.Module.ScopeName.Equals(pModuleName))
                                    {
                                        String StringToAdd = "";

                                        StringToAdd = String.Format("{0} {1}, ", TempProperty.PropertyType.FullName, TempProperty.Name);

                                        if (TempProperty.CanRead && TempProperty.CanWrite)
                                        {
                                            StringToAdd += " (get/set)";
                                        }
                                        else if (!TempProperty.CanRead && TempProperty.CanWrite)
                                        {
                                            StringToAdd += " (set ONLY)";
                                        }
                                        else if (TempProperty.CanRead && !TempProperty.CanWrite)
                                        {
                                            StringToAdd += " (get ONLY)";
                                        }
                                        else
                                        {
                                            // No action
                                        }

                                        pProperties.Add(StringToAdd);
                                    } // END if (TempProperty.Module.ScopeName.Equals(pModuleName))
                                }     // END if (TempDefaultMembers.Length > 0)
                            }         // END if (TempDefaultMembers.Length > 0)
                        }             // END if (ObjectTypes.Length > 0)
                        else
                        {
                            ReturnVal.Add("No defined types found in the compiled object.");
                        }
                    } // END else of [if (CompileResults.Errors.Count != 0)]
                }     // END if (CompileResults != null)
                else
                {
                    ReturnVal.Add("No compiled object created.");
                } // END else of [if (CompileResults != null)]
            }     // END try

            catch (Exception exUnhandled)
            {
                // Insert your exception handling code here.
                // This is only temporary.
                System.Windows.Forms.MessageBox.Show(String.Format("Error Message [{0}]{1}Error Source [{2}]",
                                                                   exUnhandled.Message,
                                                                   Environment.NewLine,
                                                                   exUnhandled.Source),
                                                     "Error",
                                                     System.Windows.Forms.MessageBoxButtons.OK,
                                                     System.Windows.Forms.MessageBoxIcon.Error);
            }  // END catch (Exception exUnhandled)
            finally
            {
                if (DOMProviderOptions != null)
                {
                    DOMProviderOptions.Clear();

                    DOMProviderOptions = null;
                }

                if (DOMProvider != null)
                {
                    DOMProvider.Dispose();

                    DOMProvider = null;
                }

                if (DOMCompilerParams != null)
                {
                    DOMCompilerParams = null;
                }
            }  // END finally

            return(ReturnVal);
        }  // END public void CompileAndExecute(String pCodeToCompile ...)
Beispiel #8
0
        public TempAssembly(XmlMapping[] xmlMappings) {
            Compiler compiler = new Compiler();
            allAssembliesAllowPartialTrust = false;
            try {
                IndentedWriter writer = new IndentedWriter(compiler.Source, false);
                writer.WriteLine("[assembly:System.Security.AllowPartiallyTrustedCallers()]");
                writer.WriteLine("namespace " + GeneratedAssemblyNamespace + " {");
                writer.Indent++;
                writer.WriteLine();

                Hashtable scopeTable = new Hashtable();
                foreach (XmlMapping mapping in xmlMappings)
                    scopeTable[mapping.Scope] = mapping;
                TypeScope[] scopes = new TypeScope[scopeTable.Keys.Count];
                scopeTable.Keys.CopyTo(scopes, 0);
                
                XmlSerializationWriterCodeGen writerCodeGen = new XmlSerializationWriterCodeGen(writer, scopes);
                writerCodeGen.GenerateBegin();
                string[] writeMethodNames = new string[xmlMappings.Length];
                for (int i = 0; i < xmlMappings.Length; i++)
                    writeMethodNames[i] = writerCodeGen.GenerateElement(xmlMappings[i]);
                writerCodeGen.GenerateEnd();
                    
                writer.WriteLine();
                
                XmlSerializationReaderCodeGen readerCodeGen = new XmlSerializationReaderCodeGen(writer, scopes);
                readerCodeGen.GenerateBegin();
                string[] readMethodNames = new string[xmlMappings.Length];
                for (int i = 0; i < xmlMappings.Length; i++)
                    readMethodNames[i] = readerCodeGen.GenerateElement(xmlMappings[i]);
                readerCodeGen.GenerateEnd();
                    
                writer.Indent--;
                writer.WriteLine("}");
                allAssembliesAllowPartialTrust = true;
                assemblies = new Hashtable();
                foreach (TypeScope scope in scopes) {
                    foreach (Type t in scope.Types) {
                        compiler.AddImport(t);
                        Assembly a = t.Assembly;
                        if (allAssembliesAllowPartialTrust && !AssemblyAllowsPartialTrust(a))
                            allAssembliesAllowPartialTrust = false;
                        if (!a.GlobalAssemblyCache)
                            assemblies[a.FullName] = a;
                    }
                }
                compiler.AddImport(typeof(XmlWriter));
                compiler.AddImport(typeof(XmlSerializationWriter));
                compiler.AddImport(typeof(XmlReader));
                compiler.AddImport(typeof(XmlSerializationReader));

                assembly = compiler.Compile();

                methods = new TempMethod[xmlMappings.Length];
                
                readerType = GetTypeFromAssembly("XmlSerializationReader1");
                writerType = GetTypeFromAssembly("XmlSerializationWriter1");

                for (int i = 0; i < methods.Length; i++) {
                    TempMethod method = new TempMethod();
                    XmlTypeMapping xmlTypeMapping = xmlMappings[i] as XmlTypeMapping;
                    if (xmlTypeMapping != null) {
                        method.name = xmlTypeMapping.ElementName;
                        method.ns = xmlTypeMapping.Namespace;
                    }
                    method.readMethod = GetMethodFromType(readerType, readMethodNames[i]);
                    method.writeMethod = GetMethodFromType(writerType, writeMethodNames[i]);
                    methods[i] = method;
                }
            }
            finally {
                compiler.Close();
            }
        }
        internal TempAssembly(XmlMapping[] xmlMappings)
        {
            Compiler compiler = new Compiler();

            allAssembliesAllowPartialTrust = false;
            try {
                Hashtable scopeTable = new Hashtable();
                foreach (XmlMapping mapping in xmlMappings)
                {
                    scopeTable[mapping.Scope] = mapping;
                }
                TypeScope[] scopes = new TypeScope[scopeTable.Keys.Count];
                scopeTable.Keys.CopyTo(scopes, 0);

                allAssembliesAllowPartialTrust = true;
                assemblies = new Hashtable();
                foreach (TypeScope scope in scopes)
                {
                    foreach (Type t in scope.Types)
                    {
                        compiler.AddImport(t);
                        Assembly a = t.Assembly;
                        if (allAssembliesAllowPartialTrust && !AssemblyAllowsPartialTrust(a))
                        {
                            allAssembliesAllowPartialTrust = false;
                        }
                        if (!a.GlobalAssemblyCache)
                        {
                            assemblies[a.FullName] = a;
                        }
                    }
                }
                compiler.AddImport(typeof(XmlWriter));
                compiler.AddImport(typeof(XmlSerializationWriter));
                compiler.AddImport(typeof(XmlReader));
                compiler.AddImport(typeof(XmlSerializationReader));

                IndentedWriter writer = new IndentedWriter(compiler.Source, false);

                // CONSIDER, alexdej: remove this (not necessary since generated assembly isn't signed)
                writer.WriteLine("[assembly:System.Security.AllowPartiallyTrustedCallers()]");

                writer.WriteLine("namespace " + GeneratedAssemblyNamespace + " {");
                writer.Indent++;
                writer.WriteLine();

                XmlSerializationWriterCodeGen writerCodeGen = new XmlSerializationWriterCodeGen(writer, scopes);

                writerCodeGen.GenerateBegin();
                string[] writeMethodNames = new string[xmlMappings.Length];
                for (int i = 0; i < xmlMappings.Length; i++)
                {
                    if (!allAssembliesAllowPartialTrust)
                    {
                        writer.WriteLine(LinkDemandAttribute);
                    }
                    writeMethodNames[i] = writerCodeGen.GenerateElement(xmlMappings[i]);
                }
                writerCodeGen.GenerateEnd();

                writer.WriteLine();

                XmlSerializationReaderCodeGen readerCodeGen = new XmlSerializationReaderCodeGen(writer, scopes);

                readerCodeGen.GenerateBegin();
                string[] readMethodNames = new string[xmlMappings.Length];
                for (int i = 0; i < xmlMappings.Length; i++)
                {
                    if (!allAssembliesAllowPartialTrust)
                    {
                        writer.WriteLine(LinkDemandAttribute);
                    }
                    readMethodNames[i] = readerCodeGen.GenerateElement(xmlMappings[i]);
                }
                readerCodeGen.GenerateEnd();

                writer.Indent--;
                writer.WriteLine("}");

                assembly = compiler.Compile();

                methods = new TempMethod[xmlMappings.Length];

                readerType = GetTypeFromAssembly("XmlSerializationReader1");
                writerType = GetTypeFromAssembly("XmlSerializationWriter1");

                for (int i = 0; i < methods.Length; i++)
                {
                    TempMethod method = new TempMethod();
                    method.isSoap = xmlMappings[i].IsSoap;
                    XmlTypeMapping xmlTypeMapping = xmlMappings[i] as XmlTypeMapping;
                    if (xmlTypeMapping != null)
                    {
                        method.name = xmlTypeMapping.ElementName;
                        method.ns   = xmlTypeMapping.Namespace;
                    }
                    method.readMethod  = GetMethodFromType(readerType, readMethodNames[i]);
                    method.writeMethod = GetMethodFromType(writerType, writeMethodNames[i]);
                    methods[i]         = method;
                }
            }
            finally {
                compiler.Close();
            }
        }
        internal bool CanRead(int methodIndex, XmlReader xmlReader)
        {
            TempMethod method = methods[methodIndex];

            return(xmlReader.IsStartElement(method.name, method.ns));
        }